Mam tablicę obiektów. Chcę znaleźć według jakiegoś pola, a następnie to zmienić:
var item = {...}
var items = [{id:2}, {id:2}, {id:2}];
var foundItem = items.find(x => x.id == item.id);
foundItem = item;
Chcę, aby zmienił oryginalny obiekt. W jaki sposób? (Nie obchodzi mnie, czy to też będzie w lodaszu)
javascript
arrays
ecmascript-6
lodash
user3712353
źródło
źródło
item
zawieraid
klucz? czy może wolisz mieć identyfikator, a także wszystkie właściwościitem
obiektu we wpisie tablicy?Odpowiedzi:
Możesz użyć findIndex, aby znaleźć indeks w tablicy obiektu i zastąpić go zgodnie z wymaganiami:
Zakłada się unikalne identyfikatory. Jeśli twoje identyfikatory są zduplikowane (jak w twoim przykładzie), prawdopodobnie lepiej będzie, jeśli użyjesz forEach:
źródło
let
słowa kluczowego zamiastvar
map
linijki, której używa @georg. Aby dowiedzieć się, co się dzieje, potrzeba mniej gimnastyki umysłowej. Warte dodatkowej linii kodu.Moje najlepsze podejście to:
Odniesienie do findIndex
A jeśli nie chcesz zastąpić nowym obiektem, ale zamiast tego skopiować pola
item
, możesz użyćObject.assign
:Object.assign(items[items.findIndex(el => el.id === item.id)], item)
jako alternatywa dla
.map()
:Object.assign(items, items.map(el => el.id === item.id? item : el))
Podejście funkcjonalne :
Nie modyfikuj tablicy, użyj nowej, aby nie generować efektów ubocznych
źródło
try/catch
, ale nie powinno się, bo nie odnalezienie elementu nie jest przypadkiem wyjątkowym; jest to standardowy przypadek, który należy wziąć pod uwagę, sprawdzając zwracaną wartość,findIndex
a następnie aktualizując tablicę dopiero po znalezieniu elementu.Innym podejściem jest użycie złącza .
NB: Jeśli pracujesz z reaktywnymi frameworkami, zaktualizuje on „widok”, a twoja tablica „wiedząc”, że ją zaktualizowałeś.
Odpowiedź :
A jeśli chcesz zmienić tylko wartość elementu, możesz użyć funkcji wyszukiwania :
źródło
Biorąc pod uwagę zmieniony obiekt i tablicę:
Zaktualizuj tablicę nowym obiektem, wykonując iterację po tablicy:
źródło
Można użyć filtra .
źródło
pracował dla mnie
źródło
Podczas gdy większość istniejących odpowiedzi jest świetnych, chciałbym dołączyć odpowiedź za pomocą tradycyjnej pętli for, którą również należy wziąć pod uwagę. OP żąda odpowiedzi zgodnej z ES5 / ES6 i obowiązuje tradycyjna pętla for :)
Problem z używaniem funkcji tablicowych w tym scenariuszu polega na tym, że nie mutują one obiektów, ale w tym przypadku mutacja jest wymagana. Wzrost wydajności wynikający z używania tradycyjnej pętli for to tylko (ogromny) bonus.
Chociaż jestem wielkim fanem funkcji tablicowych, nie pozwól, aby były one jedynym narzędziem w Twoim zestawie narzędzi. Jeśli celem jest mutowanie tablicy, nie są one najlepiej dopasowane.
źródło
Jednowierszowy z operatorem rozprzestrzeniania.
źródło