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
Wie entferne ich ein Objekt aus dem Array, indem ich die Objekteigenschaft abgleichen kann?
Bitte nur natives JavaScript.
Ich habe Probleme mit der Verwendung von Spleiß, da die Länge mit jedem Löschen abnimmt. Wenn Sie Klon verwenden und den Originalindex spleißen, besteht immer noch das Problem, dass die Länge abnimmt.
javascript
Dan Kanze
quelle
quelle
Antworten:
Ich nehme an, Sie haben so
splice
etwas benutzt?Alles, was Sie tun müssen, um den Fehler zu beheben, ist eine Dekrementierung
i
für das nächste Mal (und eine Rückwärtsschleife ist ebenfalls eine Option):Um zeitlineare Löschungen zu vermeiden, können Sie Array-Elemente schreiben, die Sie über das Array behalten möchten :
Um zeitlich lineare Suchvorgänge in einer modernen Laufzeit zu vermeiden, können Sie ein Hash-Set verwenden:
was in eine schöne Funktion eingepackt werden kann:
Wenn Sie es nicht an Ort und Stelle tun müssen, ist das
Array#filter
:quelle
Sie können ein Element anhand einer seiner Eigenschaften entfernen, ohne die folgenden Bibliotheken von Drittanbietern zu verwenden:
quelle
Mit lodash / Unterstrich:
Wenn Sie das vorhandene Array selbst ändern möchten, müssen Sie Spleiß verwenden . Hier ist der etwas bessere / lesbarere Weg mit findWhere von Unterstrich / lodash:
Mit ES5 oder höher
( ohne lodash / Unterstrich )
Ab ES5 haben wir eine
findIndex
Array-Methode, die ohne Lodash / Unterstrich einfach ist(ES5 wird in fast allen Morden-Browsern unterstützt)
Über Find und seine Browser - Kompatibilität
quelle
items.splice(items.findIndex(i => i.id === "abc"), 1)
findIndex funktioniert für moderne Browser:
quelle
So löschen Sie ein Objekt anhand seiner ID in einem bestimmten Array;
quelle
Wenn Sie es nur aus dem vorhandenen Array entfernen und kein neues erstellen möchten, versuchen Sie Folgendes:
quelle
Schleife in umgekehrter Reihenfolge durch Dekrementieren
i
, um das Problem zu vermeiden:Oder verwenden Sie
filter
:quelle
Überprüfen Sie dies mit Set- und ES6-Filter.
Hier ist JsFiddle: https://jsfiddle.net/jsq0a0p1/1/
quelle
Als alternative, "funktionalere" Lösung, die an ECMAScript 5 arbeitet, können Sie Folgendes verwenden:
Gemäß der Definition von 'Array.prototype.reduceRight' in ECMA-262 :
Dies ist also eine gültige Verwendung von
reduceRight
.quelle
gemäß Ihrer Antwort wird so sein. Wenn Sie auf ein bestimmtes Objekt klicken, senden Sie den Index im Parameter für die Funktion "Löschen". Dieser einfache Code funktioniert wie ein Zauber.
quelle
mit filter & indexOf
mit Filter & enthält
quelle
Wenn Sie kurze und selbstbeschreibende Parameter mögen oder wenn Sie keinen
splice
einfachen Filter verwenden möchten oder wenn Sie einfach eine SQL-Person wie ich sind:Und ein Beispiel für die Verwendung:
quelle
Sie können verwenden
filter
. Diese Methode gibt das Element immer zurück, wenn die Bedingung erfüllt ist. Wenn Sie also nach ID entfernen möchten, müssen Sie alle Elemente behalten, die nicht mit der angegebenen ID übereinstimmen. Hier ist ein Beispiel:quelle