我正在尝试确定我的不可变映射的某个部分是否包含某个键值checked: true
,如果是,则在上一级设置checked:true。我正在查看的对象看起来像这样:
const memo = {
"Topics": {
"filters": {
"Psychological disorders": {
"filters": {
"Anxiety disorders": {
"filters": {},
"checked": true <-- check for this value at this level
}
}
}
},
"isOpen": false
}
}
注意:此数据实际上是不可变的。
因此,在函数运行后,它将变为:
const memo = {
"Topics": {
"filters": {
"Psychological disorders": {
"checked": true, <-- check true added
"filters": {
"Anxiety disorders": {
"filters": {},
"checked": true
}
}
}
},
"isOpen": false
}
}
我现在唯一可以访问的var是“主题”名称,所以我想知道的是否是任何主题 - &gt;过滤器 - &gt;过滤器里面有checked: true
个。最初,我试图只是向JS()这个备忘录,并用lodash检查内部。
这样的事情:
_.find(memo['Topics'], _.flow(
_.property('filters'),
_.property('filters'),
_.partialRight(_.any, { checked: true })
));
我可以使用这些信息来修改对象,但我想知道是否有可能实现这一点而不会将其从不可变的中删除。到目前为止,我已经尝试过这个:
const nameCheck = 'Topics';
const hasCheckedFilters = memo.update(nameCheck, Map(),
(oldResult) => oldResult.update('filters', Map(),
(oldSection) => {
// filters inside this object has checked : true, .set('checked', true);
const fromImmutable = oldSection.toJS();
const checkForChecked = _.find(fromImmutable.filters, {checked:true});
if(checkForChecked) {
oldSectsion.set('checked', true);
}
}
)
)
);
这似乎不起作用,因为我没有循环过滤器。非常感谢任何意见,谢谢!
答案 0 :(得分:2)
这使数据不可变。我循环遍历Topics.filters中的每个属性,然后检查该属性是否具有过滤器键。如果它确实循环了。如果子项中的checked为true,则在父项中将checked设置为true并返回一个新映射。
const memo = {
"Topics": {
"filters": {
"Psychological disorders": {
"checked": false,
"filters": {
"Anxiety disorders": {
"filters": {},
"checked": true
}
}
}
},
"isOpen": false
}
};
let map = Immutable.fromJS(memo);
map.getIn(['Topics','filters']).forEach((item, i) => {
if(item.has('filters')){
item.get('filters').forEach(subItem => {
if(subItem.get('checked') === true){
map = map.setIn(['Topics', 'filters', i], item.set('checked', true));
}
});
}
});
console.log(JSON.stringify(map.toJS()));