如何更新嵌套不可变.js按键映射中的多个项目



我正在使用 REACT + REDUX 并使用不可变.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()有关,但我不确定

如果您只想更新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:我已将Map替换为Immutable.List用于payload,因为我无法识别您的Map用法语法

最新更新