Wie aktualisiere ich ein Element in List mit ImmutableJS?
Hier ist, was die offiziellen docs gesagt
updateIn(keyPath: Array<any>, updater: (value: any) => any): List<T>
updateIn(keyPath: Array<any>, notSetValue: any, updater: (value: any) => any): List<T>
updateIn(keyPath: Iterable<any, any>, updater: (value: any) => any): List<T>
updateIn(keyPath: Iterable<any, any>, notSetValue: any, updater: (value: any) => any): List<T>
Gibt es keine Möglichkeit, die normale web-Entwickler (nicht funktionale Programmierer) würde verstehen, dass!
Habe ich ganz einfach (für nicht-funktionaler Ansatz), in Fall.
var arr = [];
arr.push({id: 1, name: "first", count: 2});
arr.push({id: 2, name: "second", count: 1});
arr.push({id: 3, name: "third", count: 2});
arr.push({id: 4, name: "fourth", count: 1});
var list = Immutable.List.of(arr);
Wie kann ich ein update list
where-element mit dem Namen Dritten seine zählen eingestellt 4?
InformationsquelleAutor der Frage Vitalii Korsakov | 2015-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die am besten geeignete Fall ist, beide zu verwenden
findIndex
undupdate
Methoden.P. S. Es ist nicht immer möglich, verwenden Karten. E. g. wenn Namen nicht eindeutig sind und ich Sie aktualisieren möchten, werden alle Elemente mit dem gleichen Namen.
InformationsquelleAutor der Antwort Vitalii Korsakov
Mit .setIn() Sie können das gleiche tun:
Wenn wir nicht wissen, der index des Eintrags, die wir aktualisieren möchten. Es ist ziemlich leicht zu finden, es mit .findIndex():
Hoffe, es hilft!
InformationsquelleAutor der Antwort Albert Olivé
Brauchen Sie nicht
updateIn
ist für die verschachtelten Strukturen nur. Sie sind auf der Suche für dieupdate
Methodedie eine viel einfachere Signatur und Dokumentation:dem, wie die
Map::update
docs vorschlagen, ist "entspricht:list.set(index, updater(list.get(index, notSetValue)))
".Nicht, wie die Listen funktionieren. Sie müssen wissen, der index des Elements aus, das Sie aktualisieren möchten, oder Sie haben zu suchen.
Dies sollte es tun:
InformationsquelleAutor der Antwort Bergi
Erklärung
Aktualisieren Immutable.js Kollektionen immer wieder neue Versionen dieser Sammlungen dabei bleibt das original unverändert. Weil das so ist, können wir nicht verwenden JavaScript
list[2].count = 4
mutation syntax. Stattdessen müssen wir Methoden aufrufen, wie viel wir tun könnten, mit Java-collection-Klassen.Beginnen wir mit einem einfacheren Beispiel: nur das zählt in einer Liste.
Nun, wenn wir wollten-update der 3. Punkt, eine Ebene JS-array könnte wie folgt Aussehen:
counts[2] = 4
. Da kann man auch keine mutation, und eine Methode aufrufen müssen, sondern wir verwenden können:counts.set(2, 4)
- das heißt, setzen Sie den Wert4
am index2
.Tief updates
Das Beispiel, das Sie gegeben hat, verschachtelten Daten, obwohl. Wir können nicht einfach
set()
auf die erste collection.Immutable.js Sammlungen haben eine Familie von Methoden, mit Namen, mit der Endung "In", die es Ihnen gestatten, die tieferen Veränderungen, die in einem geschachtelten Satz. Die meisten common-Update-Methoden haben ein "In" - Methode. Zum Beispiel für
set
es istsetIn
. Statt zu akzeptieren, ein index oder ein Schlüssel als das erste argument, diese "In" - Methoden akzeptieren einen "Schlüssel Weg". Der Pfad der Schlüssel ist ein array von Indizes oder Schlüsseln, die zeigt, wie man den Wert, den Sie aktualisieren möchten.In Ihrem Beispiel, Sie wollten den Artikel aktualisieren in der Liste mit index 2, und dann den Wert im Schlüssel "count" innerhalb dieses Elements. So ist der Schlüssel Weg wäre
[2, "count"]
. Der zweite parameter dersetIn
Methode funktioniert genauso wieset
es ist der neue Wert, den wir setzen wollen, also:Suche nach dem richtigen Schlüssel Weg
Geht einen Schritt weiter, Sie tatsächlich sagte, Sie wollte den Artikel aktualisieren, wo der name ist "drei"die anders ist als nur das 3. Element. Zum Beispiel, vielleicht Ihre Liste ist nicht sortiert, oder vielleicht gibt es das Element mit Namen "zwei" war, die Sie zuvor entfernt haben? Das heißt, zunächst müssen wir sicherstellen, dass wir wirklich wissen, der richtige Schlüssel ist Weg! Für diese können wir die
findIndex()
- Methode (die, by the way, funktioniert fast genau wie Array#findIndex).Haben wir einmal fand der index in der Liste, die das Element enthält, das wir aktualisieren möchten, können wir Ihnen die Schlüssel Weg, um die Werte, die wir aktualisieren möchten:
NB:
Set
vsUpdate
Ursprünglichen Frage erwähnt, die update-Methoden anstatt der set-Methoden. Ich erkläre das zweite argument in der Funktion (genannt
updater
), da es anders ausset()
. Während das zweite argumentset()
ist der neue Wert, den wir wollen, das zweite argumentupdate()
ist ein Funktion die akzeptiert, dass der Vorherige Wert und gibt den neuen Wert, den wir wollen. DannupdateIn()
ist das "In" variation vonupdate()
akzeptiert Schlüssel Weg.Zum Beispiel sagen, wir wollten eine variation von Ihrem Beispiel, dass nicht nur die Grafen zu
4
sondern erhöht der vorhandenen Zahl, wir könnten eine Funktion, die addiert, um den vorhandenen Wert:InformationsquelleAutor der Antwort Lee Byron
Können Sie
map
:Aber diese iteriert über die gesamte Sammlung.
InformationsquelleAutor der Antwort Aldo Porcallo