2017-05-18 48 views
0

我一起工作的REACT + REDUX和使用immutable.js 所以我在此状态下结构如何更新嵌套的immutable.js中的多个项目通过键映射?

const jobs = Immutable.OrderedMap({ 
    job1: Immutable.Map({name: 'job1Name', guid: 123, status: 'in progress'}), 
    job2: Immutable.Map({name: 'job2Name', guid: 432, status: 'completed'}), 
    job3: Immutable.Map({name: 'job3Name', guid: 555, status: 'in progress'}) 
}) 

,比我有这个有效载荷在减速

const payload = Map({id: 'job1', status: 'completed'}, {id: 'job3', status: 'completed'}); 

如何得到这个

const jobs = Immutable.OrderedMap({ 
    job1: Immutable.Map({name: 'job1Name', guid: 123, status: ' completed'}), 
    job2: Immutable.Map({name: 'job2Name', guid: 432, status: 'completed'}), 
    job3: Immutable.Map({name: 'job3Name', guid: 555, status: 'completed'}) 
}) 

我认为这与merge()mergeIn()有关,但我不确定

回答

0

如果你只是想更新status字段,然后像这样将工作:

const jobs = Immutable.OrderedMap({ 
 
    job1: Immutable.Map({name: 'job1Name', guid: 123, status: 'in progress'}), 
 
    job2: Immutable.Map({name: 'job2Name', guid: 432, status: 'completed'}), 
 
    job3: Immutable.Map({name: 'job3Name', guid: 555, status: 'in progress'}) 
 
}) 
 
const payload = Immutable.List([ 
 
    {id: 'job1', status: 'completed'}, 
 
    {id: 'job3', status: 'completed'} 
 
]); 
 

 
const reducer = (state, payload) => 
 
    payload.reduce((memo, {id, status}) => memo.update(id, j => j.set("status", status)), state); 
 

 
console.log(reducer(jobs, payload).toJS())
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

PS:我已经取代MapImmutable.List为​​,因为我无法确定您的Map使用语法

+0

非常感谢,帮助我 –