var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Erläuterung
Durch das Aktualisieren der Immutable.js-Sammlungen werden immer neue Versionen dieser Sammlungen zurückgegeben, wobei das Original unverändert bleibt. Aus diesem Grund können wir die list[2].count = 4
Mutationssyntax von JavaScript nicht verwenden . Stattdessen müssen wir Methoden aufrufen, ähnlich wie bei Java-Auflistungsklassen.
Beginnen wir mit einem einfacheren Beispiel: Nur die Anzahl in einer Liste.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Wenn wir nun das dritte Element aktualisieren möchten, könnte ein einfaches JS-Array folgendermaßen aussehen : counts[2] = 4
. Da wir keine Mutation verwenden können und eine Methode aufrufen müssen, können wir stattdessen Folgendes verwenden: counts.set(2, 4)
- Das bedeutet, dass der Wert 4
am Index festgelegt wird 2
.
Tiefe Updates
Das von Ihnen angegebene Beispiel enthält jedoch verschachtelte Daten. Wir können nicht nur set()
für die erste Sammlung verwenden.
Immutable.js-Sammlungen verfügen über eine Methodenfamilie mit Namen, die mit "In" enden, sodass Sie tiefere Änderungen in einer verschachtelten Gruppe vornehmen können. Die meisten gängigen Aktualisierungsmethoden haben eine verwandte "In" -Methode. Zum Beispiel set
gibt es setIn
. Anstatt einen Index oder einen Schlüssel als erstes Argument zu akzeptieren, akzeptieren diese "In" -Methoden einen "Schlüsselpfad". Der Schlüsselpfad ist ein Array von Indizes oder Schlüsseln, die veranschaulichen, wie Sie zu dem Wert gelangen, den Sie aktualisieren möchten.
In Ihrem Beispiel wollten Sie das Element in der Liste bei Index 2 und dann den Wert beim Schlüssel "count" innerhalb dieses Elements aktualisieren. Der Schlüsselpfad wäre also [2, "count"]
. Der zweite Parameter der setIn
Methode funktioniert genauso wie set
der neue Wert, den wir dort einfügen möchten. Also:
list = list.setIn([2, "count"], 4)
Den richtigen Schlüsselpfad finden
Sie gingen noch einen Schritt weiter und sagten tatsächlich, Sie wollten das Element aktualisieren, wobei der Name "drei" ist, was sich von nur dem dritten Element unterscheidet. Zum Beispiel, vielleicht ist Ihre Liste nicht sortiert, oder vielleicht wurde dort das Element "zwei" früher entfernt? Das heißt, wir müssen zuerst sicherstellen, dass wir tatsächlich den richtigen Schlüsselpfad kennen! Hierfür können wir die findIndex()
Methode verwenden (die übrigens fast genau wie Array # findIndex funktioniert ).
Sobald wir den Index in der Liste gefunden haben, der das Element enthält, das wir aktualisieren möchten, können wir den Schlüsselpfad zu dem Wert angeben, den wir aktualisieren möchten:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vs.Update
In der ursprünglichen Frage werden die Aktualisierungsmethoden und nicht die festgelegten Methoden erwähnt. Ich werde das zweite Argument in dieser Funktion (aufgerufen updater
) erklären , da es sich von unterscheidet set()
. Während das zweite Argument to set()
der gewünschte neue Wert ist, ist das zweite Argument to update()
eine Funktion, die den vorherigen Wert akzeptiert und den gewünschten neuen Wert zurückgibt. Dann updateIn()
ist die "In" -Variante, update()
die einen Schlüsselpfad akzeptiert.
Angenommen, wir wollten eine Variation Ihres Beispiels, bei der nicht nur die Anzahl festgelegt 4
, sondern stattdessen die vorhandene Anzahl erhöht wurde. Wir könnten eine Funktion bereitstellen, die dem vorhandenen Wert eine hinzufügt:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)