immutable.js更新/设置复杂的Map

immutable.js updating/setting complicated Map

本文关键字:复杂 Map 设置 js 更新 immutable      更新时间:2023-09-26

假设我有一个不可变映射:

var testing = Immutable.fromJS({
  state: {
    name: 'secret',
    elements: [
      {
        id: 678,
        name: 'first'
      },
      {
        id: 689,
        name: 'first'
      },
      {
        id: 699,
        name: 'first'
      }
    ]
  }
})

更改状态中的名称非常容易:

testing.setIn(['state', 'name'], 'new name')

但是如何更新其中一个elements的名称?

如果我要新的元素索引,我可以这样做:

testing.setIn(['state', 'elements', 1, 'name'], 'new element index 1 name')

我一直在想,是否可以在keyPath数组中注入某种过滤器,这样我就可以根据id匹配要更新的记录?

testing.setIn(['state', 'elements', (something here that will pick right record based on id passed here), 'name'], 'new element index 1 name')

aka:

testing.setIn(['state', 'elements', MAGIC(id: 689), 'name'], 'new element index 1 name')

我可以使用findIndex()函数查找索引,然后自己添加,但我一直想知道是否有更自觉的方法可以做到这一点?

我想我可以这样做:

testing.getIn(['state', 'elements'])
  .map(element => element.get('id') === myId ? 
    element.update('name', name => 'New Name') : 
    element);

其思想是映射元素,只更新传递三元运算符的元素的名称。

我不知道有什么像你在Immutable中描述的那样。