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

web*_*ato 3 javascript immutable.js

在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' }},
});
Run Code Online (Sandbox Code Playgroud)

有没有简单纯粹的方法怎么做?

我的解决方案是:

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());
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
Run Code Online (Sandbox Code Playgroud)

但我不喜欢变量重新分配,value = value.hasIn(...也不喜欢ESLint.

zer*_*kms 5

您不需要检查路径是否存在("如果任何密钥keyPath不存在,将不会发生任何更改.",请参阅下面的链接),因此只需链接呼叫

return value.deleteIn(['b', 'c0']).deleteIn(['b', 'c1']).deleteIn(['b', 'c2']);
Run Code Online (Sandbox Code Playgroud)

此外,当您进行多次突变时,使用它可能是有益的withMutations:

return value.withMutations(map => {
    map.deleteIn(['b', 'c0']).deleteIn(['b', 'c1']).deleteIn(['b', 'c2']);
});
Run Code Online (Sandbox Code Playgroud)

参考文献: