我刚刚开始使用immutable.js,而且我无法弄清楚如何在数组中的对象上设置新属性。我在这种变化的文档中找不到任何例子。
我基本上只是想改变这个:
[{
gitInfo: {id: 8001, host: '', …},
module: {id: 24875, name: "blah", …}
}...]
到此:
[{
gitInfo: {id: 8001, host: '', …},
module: {id: 24875, name: "blah", isStared: true …}
}...]
所以w / out immutable.js我会有类似的东西:
function markModules(modules) {
modules.map( (module) => {
module.module.isStarred = false;
if (contains(this.props.stars, module.module.id)) {
module.module.isStarred = true;
}
})
return modules;
}
我假设我需要set() with a List这样的内容,但是,我再也没有找到任何示例如何执行此操作。
感谢您提供示例的任何提示或链接。
答案 0 :(得分:3)
你可以像没有Immutable.js(.map
)那样做。
const data = Immutable.fromJS([{
gitInfo: {id: 8001, host: ''},
module: {id: 24875, name: "blah"}
}, {
gitInfo: {id: 6996, host: ''},
module: {id: 666, name: "wef"}
}]);
const transformed = data.map((x) => {
return x.get('module').set('isStarred', true);
})
transformed.toJS() === [
{
"id": 24875,
"name": "blah",
"isStarred": true
},
{
"id": 666,
"name": "wef",
"isStarred": true
}
]
如果你想把额外的逻辑放在那里:
function markModules(modules) {
return modules.map((module) => {
const isStarred = contains(this.props.stars, module.getIn(['module', 'id']));
return module.setIn(['module', 'isStarred'], isStarred);
})
}
关键是将if语句转换为返回值而不是更新数据结构的值/函数。