我有关联数组 这是一个关键(数字)和价值(对象) 我需要保持这个数组的状态相同,我只需要更新一个对象属性 数组示例:
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.)'
答案 0 :(得分:1)
正如this fiddle所示,你所做的是正确的。您的代码中的其他位置可能存在问题。
我建议您将减速器分为两个功能ordersReducer
和orderReducer
。通过这种方式,您可以避免过度使用点,这可能会导致您怀疑代码的正确性。
例如:
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数组放在你的状态而不是一个对象。