2017-05-18 6 views
0

Je travaille avec le REACT + REDUX et en utilisant immutable.js J'ai donc cette structure dans l'étatComment mettre à jour plusieurs éléments dans immutable.js imbriqués Map by key?

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'}) 
}) 

et que j'ai cette charge utile dans le réducteur

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

comment obtenir cette

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'}) 
}) 

Je pense qu'il ya quelque chose à voir avec merge() ou mergeIn() mais je ne suis pas sûr

Répondre

0

Si vous voulez juste de mettre à jour champ status, alors quelque chose comme cela fonctionnera:

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: Je l'ai remplacé Map avec Immutable.List pour le payload, comme je ne pouvais pas identifier votre syntaxe de Map utilisation

+0

Merci beaucoup, ça m'a aidé –