我正在努力弄清楚使用immutability helper修改对象数组中的每个值的最佳做法。
例如,如果我在我的州里有这个:
[[Double]]
我想将每个this.state = {
items: [
{
name: "test",
subItems: [
{val: false}, {val: true}, {val: false}
]
},
{
name: "test2",
subItems: [
{val: true}, {val: true}, {val: false}
]
}
]
}
设置为val
,我该怎么做。
我可以一次做一个,但必须有更好的方法:
false
答案 0 :(得分:5)
这当然是可能的,但它是一切只有可读或可以理解的一切。
const nextState = update(state, {
items: {
$apply: (items) => {
return items.map(item => {
return update(item, {
subItems: {
$apply: (subItems) => {
return subItems.map(subItem => {
return update(subItem, {
val: {
$set: false
}
})
})
}
}
})
})
}
}
});
答案 1 :(得分:2)
对于具有不变性的ES6解决方案,destructuring并且没有帮助者:
this.setState({
// This is if you have other state besides items.
...this.state,
items: this.state.items.map(item => ({
...item,
subItems: item.subItems.map(subItem => ({
...subItem,
val: false // or e.g. setter as a function of (item, subItem)
}))
}))
});
我的眼睛比更新助手更容易。
答案 2 :(得分:0)
试试这个
this.state = {
items: [
{
name: "test",
subItems: [
{val: false}, {val: true}, {val: false}
]
},
{
name: "test2",
subItems: [
{val: true}, {val: true}, {val: false}
]
}
]
}
使用函数式编程
this.state.items
.filter((item) => item.name === test).subitems
.map((subItem) => {
subitem.forEach( (key) => {
{ [key]: !subitem[key] }
})
})