var listToDelete = ['abc', 'efg'];
var arrayOfObjects = [{id:'abc',name:'oh'}, // delete me
{id:'efg',name:'em'}, // delete me
{id:'hij',name:'ge'}] // all that should remain
Jak usunąć obiekt z tablicy, dopasowując właściwość obiektu?
Tylko natywny JavaScript.
Mam problemy z używaniem połączenia, ponieważ długość zmniejsza się przy każdym usunięciu. Korzystanie z funkcji klonowania i łączenia na indeksie oryginalnym nadal pozostawia problem z malejącą długością.
javascript
Dan Kanze
źródło
źródło
Odpowiedzi:
Zakładam, że użyłeś
splice
czegoś takiego?Wszystko, co musisz zrobić, aby naprawić błąd, to zmniejszyć
i
wartość następnym razem (a pętla do tyłu jest również opcją):Aby uniknąć usuwania w czasie liniowym, możesz napisać elementy tablicy, które chcesz zachować w tablicy:
i aby uniknąć wyszukiwania w czasie liniowym w nowoczesnym środowisku uruchomieniowym, możesz użyć zestawu skrótów:
który można opakować w fajną funkcję:
Jeśli nie musisz tego robić na miejscu, to
Array#filter
:źródło
Możesz usunąć element według jednej z jego właściwości bez korzystania z bibliotek innych firm, takich jak ta:
źródło
Z lodash / podkreśleniem:
Jeśli chcesz zmodyfikować samą istniejącą tablicę, musimy użyć splice . Oto trochę lepszy / czytelny sposób użycia funkcji findWhere podkreślenia / lodash:
Z ES5 lub nowszym
( bez lodash / podkreślenia )
Od wersji ES5 mamy
findIndex
metodę array, więc jest to łatwe bez lodash / underscore(ES5 jest obsługiwany w prawie wszystkich przeglądarkach Morden)
Informacje o findIndex i jego zgodności z przeglądarkami
źródło
items.splice(items.findIndex(i => i.id === "abc"), 1)
findIndex działa w nowoczesnych przeglądarkach:
źródło
Aby usunąć obiekt według jego identyfikatora w podanej tablicy;
źródło
Jeśli chcesz po prostu usunąć ją z istniejącej tablicy i nie tworzyć nowej, spróbuj:
źródło
Zapętlaj w odwrotnej kolejności, zmniejszając wartość,
i
aby uniknąć problemu:Lub użyj
filter
:źródło
Sprawdź to za pomocą zestawu i filtra ES6.
Oto JsFiddle: https://jsfiddle.net/jsq0a0p1/1/
źródło
Jako alternatywne, bardziej "funkcjonalne" rozwiązanie, pracując na ECMAScript 5, możesz użyć:
Zgodnie z definicją „Array.prototype.reduceRight” w ECMA-262 :
Więc to jest ważne użycie
reduceRight
.źródło
jak na twoją odpowiedź będzie tak. po kliknięciu określonego obiektu wyślij indeks w parametrze funkcji delete me. Ten prosty kod będzie działał jak urok.
źródło
z filtrem & indexOf
z filtrem i zawiera
źródło
Jeśli lubisz krótkie i samoopisujące się parametry lub jeśli nie chcesz używać
splice
prostego filtru do przodu lub jeśli jesteś po prostu osobą taką jak ja SQL:I przykładowe użycie:
źródło
Możesz użyć
filter
. Ta metoda zawsze zwraca element, jeśli warunek jest prawdziwy. Więc jeśli chcesz usunąć przez id, musisz zachować wszystkie elementy, które nie pasują do podanego id. Oto przykład:źródło