Hier ist, was offizielle Dokumente sagten
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>
Normaler Webentwickler (kein funktionierender Programmierer) würde das auf keinen Fall verstehen!
Ich habe einen ziemlich einfachen Fall (für einen nicht funktionalen Ansatz).
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 aktualisieren, list
wo für Elemente mit dem dritten Namen die Anzahl auf 4 gesetzt ist ?
javascript
functional-programming
immutable.js
Vitalii Korsakov
quelle
quelle
Antworten:
Am besten ist es, sowohl
findIndex
als auchupdate
Methoden zu verwenden.PS Es ist nicht immer möglich, Karten zu verwenden. ZB wenn Namen nicht eindeutig sind und ich alle Elemente mit den gleichen Namen aktualisieren möchte.
quelle
Mit .setIn () können Sie dasselbe tun:
Wenn wir den Index des Eintrags nicht kennen, möchten wir ihn aktualisieren. Es ist ziemlich einfach, es mit .findIndex () zu finden :
Ich hoffe es hilft!
quelle
{ }
InnerenfromJS( )
, ohne die geschweiften Klammern ist es nicht gültig JS.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.
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 Wert4
am Index festgelegt wird2
.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 essetIn
. 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 dersetIn
Methode funktioniert genauso wieset
der neue Wert, den wir dort einfügen möchten. Also: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:
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 unterscheidetset()
. Während das zweite Argument toset()
der gewünschte neue Wert ist, ist das zweite Argument toupdate()
eine Funktion, die den vorherigen Wert akzeptiert und den gewünschten neuen Wert zurückgibt. DannupdateIn()
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:quelle
Sie brauchen nicht
updateIn
, was nur für verschachtelte Strukturen ist. Sie suchen nach derupdate
Methode , die eine viel einfachere Signatur und Dokumentation hat:was, wie die
Map::update
Dokumente vorschlagen, " äquivalent zu:list.set(index, updater(list.get(index, notSetValue)))
" ist.So funktionieren Listen nicht. Sie müssen den Index des Elements kennen, das Sie aktualisieren möchten, oder Sie müssen danach suchen.
Dies sollte es tun:
quelle
Map
über aList
? Oder sagen Sie das nur, weil OP "Artikel nach Namen auswählen" und nicht "Artikel nach ID auswählen" sagte?Verwenden Sie .map ()
quelle
Ich mag diesen Ansatz von der thomastuts- Website sehr:
quelle
Sie können verwenden
map
:Dies wird jedoch die gesamte Sammlung durchlaufen.
quelle