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

时间:2016-01-11 11:33:21

标签: javascript immutable.js

假设我有一张不可变的地图:

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')

又名:

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

我可以使用findIndex()函数查找索引并将其添加到我自己,但我一直在想我是否有更有意识的方法来执行此操作?

1 个答案:

答案 0 :(得分:0)

我想我可能会这样做:

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

这个想法是你映射元素,只更新通过三元运算符的名称。

我不知道你在Immutable中所描述的任何内容。