Immutable.JS 中是否有任何功能可以从 Map 中删除多个键?
假设我想从本例中的不可变映射中删除所有嵌套键 c0
、c1
、c2
:
const x = fromJS({
a1: 'A',
a2: { b: { c0:'C0', c1:'C1' } },
a3: { b:'B' },
a4: { b: { c:'C', c1:'C1', c2:'C2' }},
a5: { b: { c: { d:'D', d1:'D1' }}},
a6: { b: { c2:'c2' }},
});
有什么简单的方法可以做到这一点吗?
我的解决方案是这样的:
const { fromJS, Map } = Immutable;
const x = fromJS({
a1: 'A',
a2: { b: { c0:'C0', c1:'C1' } },
a3: { b:'B' },
a4: { b: { c:'C', c1:'C1', c2:'C2' }},
a5: { b: { c: { d:'D', d1:'D1' }}},
a6: { b: { c2:'c2' }},
});
console.log(x.toJS());
const newX = x.map((value, key) => {
if (Map.isMap(value)){
value = value.hasIn(['b', 'c0']) ? value.deleteIn(['b', 'c0']) : value;
value = value.hasIn(['b', 'c1']) ? value.deleteIn(['b', 'c1']) : value;
value = value.hasIn(['b', 'c2']) ? value.deleteIn(['b', 'c2']) : value;
}
return value;
});
console.log('----------------------------');
console.log(newX.toJS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
但我不喜欢在 value = value.hasIn(...
和 ESLint 中重新分配变量。
最佳答案
您不需要检查路径是否存在(“如果 keyPath
中的任何键不存在,则不会发生任何更改。”,请参阅下面的链接),因此只需链接调用
return value.deleteIn(['b', 'c0']).deleteIn(['b', 'c1']).deleteIn(['b', 'c2']);
此外,当您进行多个突变时,使用 withMutations
可能会有好处:
return value.withMutations(map => {
map.deleteIn(['b', 'c0']).deleteIn(['b', 'c1']).deleteIn(['b', 'c2']);
});
引用资料:
关于javascript - 从 Immutable.js Map 中删除多个嵌套键的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39541553/