2017-06-14 3 views
0

Je suis en train d'utiliser la fonction de réduire les ImmutableJS de façon:Comment utiliser la fonction de réduction d'ImmutableJS avec un accumulateur Immutable?

const myChanges = data 
    .getIn(['a', 'b']) // Immutable.List 
    .reduce((accum, data) => { 
    // console.log('accum', accum); 
    // console.log('data', data); <--- an Immutable.Map 
    accum.push(List([ data.get('id'), data.get('time') ])); 
    return accum; 
    }, List()); 

Cependant, accum consolent toujours les journaux comme un Immutable.List vide. Je suppose que c'est parce que List() ne peut pas être muté, donc chaque fois accum retourne une nouvelle Immutable.List vide(). Ce que je voudrais obtenir est une liste de listes, où chacune des listes internes (essentiellement un tuple) se compose de id et de time.

Comment puis-je faire fonctionner cela? Dois-je utiliser withMutations?

Répondre

1

Dans immuable toutes les données sont « lecture seule », lorsque vous appelez la méthode de push il retourne un nouvel objet avec les changements. Ce code fonctionne, vous devez retourner directement:

const myChanges = data.getIn(['a', 'b']) 
    .reduce((accum, data) => { 
     return accum.push(List([ data.get('id'), data.get('time') ])); 
    }, List()); 

ou vous pouvez stocker le résultat dans une variable et le retourner

const myChanges = data.getIn(['a', 'b']) 
    .reduce((accum, data) => { 
     let result = accum.push(List([ data.get('id'), data.get('time') ])); 
     return result; 
    }, List()); 
0

Votre problème est que vous renvoyez l'original accum, pas la nouvelle valeur qui inclut les données. Rappelez-vous que push renvoie une nouvelle liste, contrairement à un JS mutable Array!

const myChanges = data 
    .getIn(['a', 'b']) 
    .reduce((accum, d) => { 
    return accum.push(List([ d.get('id'), d.get('time') ])); 
    }, List());