Javascript 更新状态,其中Redux/React中的值=x

Javascript 更新状态,其中Redux/React中的值=x,javascript,reactjs,redux,lodash,normalizr,Javascript,Reactjs,Redux,Lodash,Normalizr,我的商店中有一组用户,设置如下: {users: {user_id: 1, user_name: Adam, user_score: 100}, {user_id: 2, user_name: Bob, user_score: 200}, {user_id: 3, user_name: Charlie, user_score: 300}} {user_id: 1, score: 10} 我的项目正在从如下设置的服务器接收JSON数据: {users: {user_id: 1, user_

我的商店中有一组用户,设置如下:

{users: {user_id: 1, user_name: Adam, user_score: 100}, 
{user_id: 2, user_name: Bob, user_score: 200}, 
{user_id: 3, user_name: Charlie, user_score: 300}}
{user_id: 1, score: 10}
我的项目正在从如下设置的服务器接收JSON数据:

{users: {user_id: 1, user_name: Adam, user_score: 100}, 
{user_id: 2, user_name: Bob, user_score: 200}, 
{user_id: 3, user_name: Charlie, user_score: 300}}
{user_id: 1, score: 10}
我想找到传递数据的
user\u id
与现有用户集的
user\u id
匹配的位置,并将分数更新为传入的
score

例如,如果减速机接收到
{user_id:2,score:10}
如何将
分数更改为
10
,其中原始状态下的用户id等于
2
。当然,在避免变异的同时

用什么方法做这件事最好?正常化者?洛达斯?更新()? 看起来很简单,我肯定错过了一些明显的东西。
谢谢。

我建议为此使用
immutable.js

将要更新的用户的
id
传递到
操作
,然后将其传递到
减速机
,并使用
不可变
更新用户数据

所以您在immutable中编写的代码类似于

  const data = Immutable.fromJS(state)
  const newState = data.setIn(['users', user_id, 'score'], 10);
  return newState.toJS()
附言:我还没有测试过上面的内容,但它应该可以工作(如果没有修改的话)

您可以阅读有关不可变的内容


此外,我还建议您阅读一个类似的答案

为此,我建议使用
immutable.js

将要更新的用户的
id
传递到
操作
,然后将其传递到
减速机
,并使用
不可变
更新用户数据

所以您在immutable中编写的代码类似于

  const data = Immutable.fromJS(state)
  const newState = data.setIn(['users', user_id, 'score'], 10);
  return newState.toJS()
附言:我还没有测试过上面的内容,但它应该可以工作(如果没有修改的话)

您可以阅读有关不可变的内容


另外,我建议您在reducer中使用类似的答案,您可以遍历现有用户数组,并为与
用户id
匹配的数组设置一个新值

function usersReducer(state = [], action) {
  switch (action.type) {
  case 'UPDATE_SCORE':
    var { user_id, score } = action
    return state.map(u => {
      if (u.user_id === user_id) {
        // for the matching user, return an
        // object with the updated score
        return Object.assign({}, u, { score })
      } else {
        // for all other users, return the
        // existing object
        return u
      }
    })
  default:
    return state
  }
}

在reducer中,您可以遍历现有用户数组,并为与
用户id
匹配的数组设置一个新值

function usersReducer(state = [], action) {
  switch (action.type) {
  case 'UPDATE_SCORE':
    var { user_id, score } = action
    return state.map(u => {
      if (u.user_id === user_id) {
        // for the matching user, return an
        // object with the updated score
        return Object.assign({}, u, { score })
      } else {
        // for all other users, return the
        // existing object
        return u
      }
    })
  default:
    return state
  }
}