2015-09-05 234 views
2

我刚刚开始使用immutable.js,并且在解决如何在数组中的对象上设置新属性时遇到问题。我无法在这种变化的文档中找到任何示例。immutable.js映射到数组(List)并添加一个属性

我基本上只是试图采取改变这种:

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

这样:

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

所以瓦特/ 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这样的东西,但是再次,我没有找到任何示例如何做到这一点。

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

回答

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语句到值/函数,而不是返回更新数据结构的值。

相关问题