javascript - 从 Immutable.js Map 中删除多个嵌套键的最佳方法是什么

标签 javascript immutable.js

Immutable.JS 中是否有任何功能可以从 Map 中删除多个键?

假设我想从本例中的不可变映射中删除所有嵌套键 c0c1c2:

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/

相关文章:

javascript - 如何从 .map() JS 创建不可变 map

javascript - 如何在 Greasemonkey 脚本中以特定时间间隔加载 URL?

javascript - 使用 jQuery 选择附加的链接按钮

javascript - 为连接速度慢的用户用图像替换视频

javascript - 如何查看浏览器是否支持 'let'?

javascript - rails : View javascript object's attributes in browser's console

javascript - ImmutableJS/FlowType : Is it possible to typeCheck an array returned by a List. toJS()

javascript - 使用 redux-saga 删除项目

javascript - ImmutableJS - 更新列表中的值

javascript - 从 Immutable.js 中的 Map 中的 List 中删除元素的最佳方法