2016-10-31 1 views
0

Ich möchte Swap-Artikel innerhalb einer unveränderlichen Liste innerhalb eines Map, Beispiel:Wie sortiere ich Objekte innerhalb einer Immutable Map?

const Map = Immutable.fromJS({ 
    name:'lolo', 
    ids:[3,4,5] 
}); 

i Spleiß zu verwenden, versuche das Swapping zu tun, auch mit insert() eine unveränderliche Methode versucht.

Lets sagen, dass ich von [3, 4, 5] zu [3, 5, 4] tauschen wollen, ich bin Abrichten etwas wie folgt aus:

list.set('ids', list.get('ids').splice(2, 0, list.get('ids').splice(1, 1)[0])

Was ist der beste Weg, Elemente innerhalb einer unveränderlichen Datenstrukturen zu sortieren mit Immutable.js?

+0

vorstellen, ich benutze diese mit redux, kann ich eine neue Version der Datenstruktur aus einem Druckminderer nicht zurück? – Alejandro

+0

Zuerst dachte ich daran, mit 'withMutations()' herumzualbern, aber das wäre wirklich deine eigene Funktion dafür. Übrigens, wenn man darüber nachdenkt, ist Swapping insbesondere eine unbeholfene Reihe von Operationen selbst bei einfach veränderbaren Daten. –

Antwort

1

Sie Map.update() und List.withMutations() für diese Angelegenheit verwendet werden soll:

map.update('ids', idsList => idsList.withMutations(function (idsList) { 
    let temp = idsList.get(2); 
    return idsList.set(2, idsList.get(1)).set(1, temp); 
})); 

Beachten Sie, dass ich umbenannt list zu map - das ist eigentlich ein Map.

Und für einfache Sortierung für

map.update('ids', idsList => idsList.sort(function (a, b) { 
    // magic 
}); 
+0

basierend auf Ihrem Code sind diese Code-Schnipsel das gleiche tun? http://collabshot.com/show/nGarJf – Alejandro

+0

Nein. Sie haben '.update()' in '.set()' geändert und sie sind nicht austauschbar, da 'set' einfach das zweite Argument übernimmt und an die angegebene Stelle setzt, während' update' die Updater-Funktion vom zweiten Argument und aufruft Legen Sie den zurückgegebenen Wert fest. Sieh den Unterschied? –

+0

@ AlejandroBáezArcila die Antwort akzeptieren? –

0

können Sie Destrukturierung Zuordnung verwenden, um Werte an verschiedenen Indizes der Array zu tauschen

const list = Immutable.fromJS({name:'lolo',ids:[3,4,5]}); 

[list._root.entries[1][1]._tail.array[1], list._root.entries[1][1]._tail.array[2]] = [ 
    list._root.entries[1][1]._tail.array[2] 
    , list._root.entries[1][1]._tail.array[1] 
]; 

console.log(list.get("ids").toArray()); 

plnkr http://plnkr.co/edit/ZcEFNIFTnji3xxs7uTCT?p=preview

1

Parametrisierte gehen:

function swap(map, key, from, to) { 
    return map.update(key, list => list.withMutations(list => { 
     let soruce = list.get(from); 
     let destination = list.get(to); 
     return list.set(to, soruce).set(from, destination); 
    })); 
} 
Verwandte Themen