2015-12-08 1 views
2

J'essaie de fusionner un tableau immuable d'objets en utilisant Reacts Immutability helpers ou Immutable js qui jamais. J'essaye de créer une liste d'enregistrements seulement où les noms ont changé. J'essaie d'éviter de créer des doublons dans la liste si le nom a été changé plusieurs fois avant la soumission, ce qui m'a amené à croire qu'une fusion était le chemin que je devais prendre. Un exemple de ce que j'essaie de réaliser est ci-dessous.Réagir fusionner tableau immuable d'objets en utilisant React Immutability helpers ou Immutable js

var objArray = [{id:4, name:'bar'}, {id:10, name:'test'}]; 
var newObj = {id:4, name:'foo'}; 

var updatedEntries = update(this.state.nameChanges, {$merge: {newObj}); 

Le résultat que je cherche est:

objArray = [{id:4, name:'foo'}, {id:10, name:'test'}] 

Le résultat me semble être obtenir est:

objArray = [{id:4, name:'foo'}] 

J'ai essayé d'utiliser Facebook React aides immutabilité, mais ne peut pas sembler obtenir le résultat dont j'ai besoin. Je semble avoir un peu de mal à essayer de comprendre ce que fait la fonction de fusion. Toute aide est appréciée.

Merci

+0

Je ne suis pas sûr de ce que vous êtes 'update' fait, mais' merge' [fonctionne pour moi] (http://codepen.io/tyrsius/pen/mVyQxL ? editors = 001) – Tyrsius

+0

@Tyrsius Ce n'est pas ImmutableJS - ce sont les variantes intégrées avec lesquelles React est livré. –

+0

Oh, dans ce cas, je viens de vous montrer comment le faire avec ImmutableJS. Est-ce que ça marche? – Tyrsius

Répondre

2

Vous y êtes presque, ce que vous devez faire est d'abord filtrer l'objet que vous voulez, puis en utilisant merge via son index dans la objArray. Le official docs montre comment faire

var objArray = [{id: 4, name: 'bar'}, {id: 10, name: 'test'}]; 

var i = -1; 
objArray.map(function (obj, index) { 
    if (obj.name === 'bar') i = index; 
}); 

var mergeObject = {}; 
mergeObject[i] = {$merge: {name: 'Foo'}}; 

var newState = update(objArray, mergeObject); 

>> [[object Object] { 
    id: 4, 
    name: "Foo" 
}, [object Object] { 
    id: 10, 
    name: "test" 
}] 
+0

Un peu plus de code alors j'attends qu'il y en ait mais ouais c'est ce dont j'ai besoin merci – AndrewBrntt

+0

J'étais trop verbeux, vous pouvez utiliser map comme un itérateur de fantaisie et une variable pour refermer l'index. J'ai mis à jour le code un peu. Mais puisque vous voulez définir une clé dynamique sur la fusion, vous devez créer cet objet intermédiaire. –

+0

Y a-t-il une meilleure solution? Y a-t-il une autre bibliothèque qui fait cela? – Anenth