Ich habe eine Reihe von Objekten. Ich möchte nach einem Feld suchen und es dann ändern:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Ich möchte, dass das ursprüngliche Objekt geändert wird. Wie? (Es ist mir egal, ob es auch in lodash sein wird)
javascript
arrays
ecmascript-6
lodash
user3712353
quelle
quelle
item
einenid
Schlüssel? oder macht es Ihnen etwas aus, die ID sowie alle Eigenschaften desitem
Objekts im Array-Eintrag zu haben?Antworten:
Mit findIndex können Sie den Index im Array des Objekts suchen und bei Bedarf ersetzen:
Dies setzt eindeutige IDs voraus. Wenn Ihre IDs doppelt vorhanden sind (wie in Ihrem Beispiel), ist es wahrscheinlich besser, wenn Sie forEach verwenden:
quelle
let
Schlüsselwort anstelle vonvar
map
@georg verwendeten Einzeiler zu verwenden. Weniger mentale Gymnastik erforderlich, um herauszufinden, was los ist. Lohnt sich die zusätzliche Codezeile.Mein bester Ansatz ist:
Referenz für findIndex
Und falls Sie nicht durch ein neues Objekt ersetzen möchten, sondern stattdessen die Felder von kopieren möchten
item
, können Sie Folgendes verwendenObject.assign
:Object.assign(items[items.findIndex(el => el.id === item.id)], item)
als Alternative mit
.map()
:Object.assign(items, items.map(el => el.id === item.id? item : el))
Funktionsansatz :
Ändern Sie das Array nicht, verwenden Sie ein neues, damit Sie keine Nebenwirkungen erzeugen
quelle
try/catch
aber nicht, da es kein Ausnahmefall ist, das Element nicht zu finden. Dies ist ein Standardfall, den Sie berücksichtigen sollten, indem Sie den Rückgabewert von überprüfenfindIndex
und das Array erst dann aktualisieren, wenn das Element gefunden wurde.Ein anderer Ansatz ist die Verwendung von Spleiß .
NB: Wenn Sie mit reaktiven Frameworks arbeiten, wird die "Ansicht" aktualisiert, und Ihr Array "weiß", dass Sie sie aktualisiert haben.
Antworten :
Und falls Sie nur einen Wert eines Elements ändern möchten, können Sie die Suchfunktion verwenden:
quelle
Bei einem geänderten Objekt und einem Array:
Aktualisieren Sie das Array mit dem neuen Objekt, indem Sie über das Array iterieren:
quelle
Kann Gebrauch sein Filter .
quelle
arbeitete für mich
quelle
Während die meisten der vorhandenen Antworten großartig sind, möchte ich eine Antwort mit einer traditionellen for-Schleife einfügen, die auch hier berücksichtigt werden sollte. Das OP fordert eine Antwort an, die ES5 / ES6-kompatibel ist, und es gilt die traditionelle for-Schleife :)
Das Problem bei der Verwendung von Array-Funktionen in diesem Szenario besteht darin, dass sie keine Objekte mutieren. In diesem Fall ist jedoch eine Mutation erforderlich. Der Leistungsgewinn bei der Verwendung einer herkömmlichen for-Schleife ist nur ein (großer) Bonus.
Obwohl ich ein großer Fan von Array-Funktionen bin, lassen Sie sie nicht das einzige Werkzeug in Ihrer Toolbox sein. Wenn der Zweck darin besteht, das Array zu mutieren, passen sie nicht am besten.
quelle
Einzeiler mit Spread Operator.
quelle