我有关联数组。
这是一个键(数字)和值(对象)。
我需要保持此数组的状态不变,因为我只需要更新一个对象属性。
数组示例:
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: ...}
解决方案(我的Reducer中的代码)
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.)'
正如这个小提琴所证明的,您在做什么是正确的。您的代码中的其他地方可能存在问题。
我建议您将减速器分为两个功能,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中标准化状态形状的文章。请注意,它们是如何从使用原始示例中的数组迁移到具有键之类的对象的users1
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句