映射数组(列表),并添加一个属性

immutable.js map over array (List) and add a property

本文关键字:一个 属性 添加 数组 列表 映射      更新时间:2023-09-26

我刚开始与immutable.js和我有麻烦弄清楚如何设置一个新的属性在数组中的对象。我很难在文档中找到这种更改的任何示例。

我只是想改变这个:

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

to this:

[{ 
  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()的列表,但同样,我没有找到任何例子如何做到这一点。

如果没有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语句变成返回值的值/函数,而不是更新数据结构。