Wie entferne ich ein Array-Element in TypeScript?

404

Ich habe ein Array, das ich in TypeScript erstellt habe, und es hat eine Eigenschaft, die ich als Schlüssel verwende. Wie kann ich einen Artikel entfernen, wenn ich diesen Schlüssel habe?

Tim Almond
quelle

Antworten:

639

Genauso wie in JavaScript.

delete myArray[key];

Beachten Sie, dass dies das Element auf setzt undefined.

Besser die Array.prototype.spliceFunktion nutzen:

const index = myArray.indexOf(key, 0);
if (index > -1) {
   myArray.splice(index, 1);
}
Blorkfish
quelle
8
Sie können dem einen Typ hinzufügen! var index: number = myArray.indexOf(key, 0);
CorayThan
17
@CorayThan Sicherlich würde es implizit als indexOfRückgabe a number?
Chris
5
@Chris In diesem einfachen Fall ist es offensichtlich, dass Sie Fehler schneller diagnostizieren können, wenn Sie für jede Variable explizit einen Typ definieren. Sie verwenden bereits indexan mehr als einer Stelle und eine dieser Stellen ( splice) möchte eine Nummer sehen, oder Sie erhalten eine Fehlermeldung. Derzeit kann der Compiler nicht verhindern, dass Sie dort Fehler machen.
Jochem Kuijpers
33
@blorkfish Es ist gut zu erwähnen, dass Sie verwenden können, wenn Sie eine Liste von Objekten haben var index = myArray.findIndex(x => x.prop==key.prop);.
Francisco Cabral
6
@ Cirelli94 - Sie antworten auf einen älteren Thread, aber die Antwort auf Ihre Frage lautet, dass das Löschen eines Array-Elements seine Länge nicht ändert oder das Array neu indiziert. Da Arrays Objekte in JavaScript sind, wird die Eigenschaft von delete myArr[2]buchstäblich gelöscht , was sich auch von unterscheidet . Die Moral dieser Geschichte besteht darin, sie nur für diese Aufgabe zu verwenden, da dies ein sicherer Weg ist, um den gewünschten Effekt zu erzielen, ohne die Nebenwirkungen zu verwirren. 2myArrmyArr[2] = undefinedsplice
Winglerw28
200

Wenn Array ein Objekttyp ist, ist dies der einfachste Weg

let foo_object // Item to remove
this.foo_objects = this.foo_objects.filter(obj => obj !== foo_object);
Malik Shahzad
quelle
20
Dies entfernt nichts, was es einfach filtert. Wenn die Liste tatsächlich geändert werden muss, ist dies nicht der richtige Weg.
user573434
6
@ user573434 ja, du hast recht, wie der Name schon sagt. Dies ist jedoch ein einfacher Ansatz für den Fall, dass Sie ein Objekt bei erfolgreichem Lösch-API-Aufruf usw. entfernen möchten.
Malik Shahzad
3
Dies funktionierte perfekt für eine Reihe von Objekten ohne eine eindeutige Schlüsseleigenschaft. @ user573434 Die Filtermethode gibt ein neues Array ohne das gefilterte Objekt zurück, sodass das Objekt aus dem resultierenden Array entfernt wird.
Jason
6
Ich denke, um es als Objekt zurückzugeben, müssen Sie dies tunthis.foo_objects = this.foo_objects.filter(obj => obj !== foo_object)[0];
Roel
1
Das funktioniert. Lesen Sie einfach die 2. Zeile sorgfältig durch. er macht einen Filter mit obj! = foo_object. und weist es der ursprünglichen Variablen zu, wodurch das ursprüngliche Array durch eins minus dem gefilterten foo_object ersetzt wird. verwendet es mit einer Reihe von Objekten mit ID deleteById(id: string) { this.data = this.data.filter(d => d.id !== id); }Nur ein Wort der Warnung, wenn IDs nicht eindeutig sind, werden Sie alle mit dem gleichen entfernenid
Markus
74

Mit ES6 können Sie diesen Code verwenden:

removeDocument(doc){
   this.documents.forEach( (item, index) => {
     if(item === doc) this.documents.splice(index,1);
   });
}
Idak
quelle
1
Beste Lösung zum Entfernen, ohne die Array-Referenz zu ändern UND mit der Möglichkeit, einen bestimmten Gleichheitsalgorithmus zu implementieren
Sid
1
Beste Antwort gefunden
Gvs Akhil
1
Beste Antwort bei Verwendung von ES6
Nathan Beck
2
Sie können auch Folgendes verwenden: this.documents.forEach ((item, index, array) => {if (item === doc) array.splice (index, 1);}); Das kann viel sauberer sein, besonders wenn Sie mit verschachtelten Arrays arbeiten.
CGundlach
20

Es ist meine Lösung dafür:

onDelete(id: number) {
    this.service.delete(id).then(() => {
        let index = this.documents.findIndex(d => d.id === id); //find index in your array
        this.documents.splice(index, 1);//remove element from array
    });

    event.stopPropagation();
}
Butsaty
quelle
Das Schöne an dieser Lösung ist, dass sie auch dann funktioniert, wenn die Objektgleichheit zwei Objekte nicht als gleich identifiziert.
Brad Johnson
18

Sie können die spliceMethode für ein Array verwenden, um die Elemente zu entfernen.

Wenn Sie beispielsweise ein Array mit dem Namen haben, arrverwenden Sie Folgendes:

arr.splice(2, 1);

Hier ist also das Element mit Index 2 der Ausgangspunkt und das Argument 2 bestimmt, wie viele Elemente gelöscht werden sollen.

Wenn Sie das letzte Element des genannten Arrays löschen möchten, arrgehen Sie folgendermaßen vor:

arr.splice(arr.length-1, 1);

Dies gibt arr mit dem zuletzt gelöschten Element zurück.

Beispiel:

var arr = ["orange", "mango", "banana", "sugar", "tea"];
arr.splice(arr.length-1, 1)
console.log(arr); // return ["orange", "mango", "banana", "sugar"]
akash venugopal
quelle
1
Nur zu Ihrer Information, die Spleißmethode ändert das Array (in diesem Fall wird das letzte Element entfernt) und gibt die entfernten Elemente zurück, nicht das Array selbst.
CGundlach
2
Es sollte eigentlich arr.splice (arr.length-1,1) sein, um das letzte Element zu entfernen.
Steve In CO
15

Abteilungen lassen ist ein Array. Sie möchten ein Element aus diesem Array entfernen.

departments: string[] = [];

 removeDepartment(name: string): void {
    this.departments = this.departments.filter(item => item != name);
  }
Abdus Salam Azad
quelle
8

Hier ist ein einfacher Einzeiler zum Entfernen eines Objekts nach Eigenschaften aus einem Array von Objekten.

delete this.items[this.items.findIndex(item => item.item_id == item_id)];

oder

this.items = this.items.filter(item => item.item_id !== item.item_id);
Jamie Armor
quelle
1
Das Problem bei der ersten Lösung besteht darin, dass durch Löschen das Element entfernt wird, die Arraygröße jedoch dieselbe bleibt wie vor dem Detelieren. In der zweiten Lösung haben wir ein neues Objekt. Wenn wir also eine SPME-Abhängigkeit haben, verlieren wir es. Spleißen (was in der oberen Antwort steht) hat diesen Effekt nicht.
Krystian
Vielen Dank für den Hinweis. Ich denke, in meinem Anwendungsfall hatte ich das noch nicht entdeckt. Gut beobachtet :)
Jamie Armor
5

Antworten Sie mit dem TypeScript-Spread-Operator (...)

// Your key
const key = 'two';

// Your array
const arr = [
    'one',
    'two',
    'three'
];

// Get either the index or -1
const index = arr.indexOf(key); // returns 0


// Despite a real index, or -1, use spread operator and Array.prototype.slice()    
const newArray = (index > -1) ? [
    ...arr.slice(0, index),
    ...arr.slice(index + 1)
] : arr;
Joshua Michael Waggoner
quelle
5

Eine weitere Lösung mit Typescript:

let updatedArray = [];
for (let el of this.oldArray) {
    if (el !== elementToRemove) {
        updated.push(el);
    }
}
this.oldArray = updated;
Sch. Pavel
quelle
Dies behebt zwar das gestellte Problem, die Ausführung ist jedoch teuer, da ein neues Array erstellt und das Original durchlaufen wird. Diese Art von Operation an einem riesigen Array kann unerwünschte Nebenwirkungen hervorrufen, wie z. B. eine stärkere Belastung der mobilen Batterien, langes Warten, Ruckeln usw.
Jessy,
1

Verwenden Sie diese Option, wenn Sie ein bestimmtes Objekt aus einem Array entfernen müssen und Folgendes sicherstellen möchten:

  • Die Liste wird nicht neu initialisiert
  • Die Array-Länge wird ordnungsgemäß aktualisiert
    const objWithIdToRemove;
    const objIndex = this.objectsArray.findIndex(obj => obj.id === objWithIdToRemove);
    if (objIndex > -1) {
      this.objectsArray.splice(objIndex, 1);
    }
Radu Linu
quelle
0

Ich wollte nur eine Erweiterungsmethode für ein Array hinzufügen.

interface Array<T> {
      remove(element: T): Array<T>;
    }

    Array.prototype.remove = function (element) {
      const index = this.indexOf(element, 0);
      if (index > -1) {
        return this.splice(index, 1);
      }
      return this;
    };
Supernerd
quelle