immutable.js映射数组(List)并添加属性

时间:2015-09-05 01:09:52

标签: javascript immutable.js

我刚刚开始使用immutable.js,而且我无法弄清楚如何在数组中的对象上设置新属性。我在这种变化的文档中找不到任何例子。

我基本上只是想改变这个:

[{ 
  gitInfo: {id: 8001, host: '', …},
  module: {id: 24875, name: "blah", …}
}...]

到此:

[{ 
  gitInfo: {id: 8001, host: '', …},
  module: {id: 24875, name: "blah", isStared: true …}
}...]

所以w / out immutable.js我会有类似的东西:

function markModules(modules) {
    modules.map( (module) => {
      module.module.isStarred = false;
      if (contains(this.props.stars, module.module.id)) {
        module.module.isStarred = true;
      }
    })
    return modules;
  }

我假设我需要set() with a List这样的内容,但是,我再也没有找到任何示例如何执行此操作。

感谢您提供示例的任何提示或链接。

1 个答案:

答案 0 :(得分:3)

你可以像没有Immutable.js(.map)那样做。

const data = Immutable.fromJS([{ 
  gitInfo: {id: 8001, host: ''},
  module: {id: 24875, name: "blah"}
}, { 
  gitInfo: {id: 6996, host: ''},
  module: {id: 666, name: "wef"}
}]);

const transformed = data.map((x) => {
    return x.get('module').set('isStarred', true);
})

transformed.toJS() === [
  {
    "id": 24875,
    "name": "blah",
    "isStarred": true
  },
  {
    "id": 666,
    "name": "wef",
    "isStarred": true
  }
]

如果你想把额外的逻辑放在那里:

function markModules(modules) {
  return modules.map((module) => {
    const isStarred = contains(this.props.stars, module.getIn(['module', 'id']));
    return module.setIn(['module', 'isStarred'], isStarred);
  })
}

关键是将if语句转换为返回值而不是更新数据结构的值/函数。