如何仅更新关联数组中嵌套对象的一个​​特定属性

时间:2017-11-22 18:27:41

标签: javascript reactjs ecmascript-6 redux react-redux

我有关联数组 这是一个关键(数字)和价值(对象) 我需要保持这个数组的状态相同,我只需要更新一个对象属性 数组示例:

5678: {OrderId: 1, Title: "Example 1", Users: [{UserId: 1}, {UserId: 2}, {UserId: 3}]}
5679: {OrderId: 2, Title: "Example 2", Users: [{UserId: 1}, {UserId: 2}, {UserId: 3}]}

我需要更新Users数组属性 我尝试了这个,但它不起作用:

ordersAssociativeArray: {
        ...state.ordersAssociativeArray,
        [action.key]: {
          ...state.ordersAssociativeArray[action.key],
          Users: action.updatedUsers
        }
      }

这是减速机内的数据 我做错了怎么解决这个问题?

可能有用的东西。
当我检查chrome中的值时,我执行上面的代码后检查以前的值和值:
之前:

ordersAssociativeArray:Array(22) > 5678: Order {OrderId: ...}

后:

ordersAssociativeArray: > 5678: {OrderId: ...}



解决方案(我的减速机中的代码)

let temp = Object.assign([], state.ordersAssociativeArray);
temp[action.key].Users = action.updatedUsers;
return {
      ...state,
      ordersAssociativeArray: temp
}

所以这段代码工作正常。 但我还是不明白为什么?所以我有解决方案,但是如果有人能解释我为什么这种方式有效并且首先没有呢? 如果它可以帮助我在这里如何将对象初始化为这个关联数组:

ordersAssociativeArray[someID] = someObject // this object is created by 'new Order(par1, par2 etc.)'

2 个答案:

答案 0 :(得分:1)

正如this fiddle所示,你所做的是正确的。您的代码中的其他位置可能存在问题。

我建议您将减速器分为两个功能ordersReducerorderReducer。通过这种方式,您可以避免过度使用点,这可能会导致您怀疑代码的正确性。

例如:

const ordersReducer = (state, action) => {
  const order = state[action.key]

  return {
    ...state,
    [action.key]: orderReducer(order, action)
  }
}

const orderReducer = (state, action) => {
  return {
    ...state,
    Users: action.updatedUsers
  }
}

我希望你找到你的错误!

<强>更新

在您的解决方案中,您使用let temp = Object.assign([], state.ordersAssociativeArray);。这很好,但我认为你应该知道,即使按数字索引,有时也最好使用{}

javascript中的数组对于表示规范化数据并不是很好,因为如果缺少id,js数组在该索引处仍会有undefined个条目。例如,

const orders = []
array[5000] = 1 // now my array has 4999 undefined entries

另一方面,如果你使用带有整数键的对象,你会得到很好的紧密条目。

const orders = {}
orders[5000] = 1 // { 5000: 1 } no undefined entries

以下是有关redux中normalizing state shape的文章。请注意他们如何从使用原始示例中的数组迁移到具有users1等键的对象。

答案 1 :(得分:0)

问题可能是你在状态中使用数组,但在你作为对象的reducer中使用。尝试做:

ordersAssociativeArray: [     //an array and not an object
    ...state.ordersAssociativeArray,
    [action.key]: {
        ...state.ordersAssociativeArray[action.key],
        Users: action.updatedUsers
    }
]

它会将ordersAssociative数组放在你的状态而不是一个对象。