Wie entferne ich ein bestimmtes Element aus einem Array in Javascript?

Ich habe ein Array von ganzen Zahlen und verwende die Methode .push() , um Elemente hinzuzufügen.

Gibt es eine einfache Möglichkeit, ein bestimmtes Element aus einem Array zu entfernen? Das Äquivalent von so etwas wie array.remove(int); .

Ich muss einfaches Javascript verwenden - es sind keine Frameworks erlaubt.

6774
24 апр. von Walker am 24. April eingestellt 2011-04-24 01:17 11 um 01:17 2011-04-24 01:17
@ 78 Antworten
  • 1
  • 2
  • 3

Suchen Sie den index des Arrayelements, das Sie entfernen möchten, und löschen Sie diesen Index anschließend mit dem splice .

Die splice () -Methode ändert den Inhalt eines Arrays, indem vorhandene Elemente gelöscht und / oder neue Elemente hinzugefügt werden.

Browser-Unterstützung für indexOf ist begrenzt.  Es wird in Internet Explorer 7 und 8 nicht unterstützt. 

Wenn Sie indexOf in einem nicht unterstützten Browser benötigen, versuchen Sie es mit indexOf next polyfill . Weitere Informationen zu diesem polyfill hier .

 Array.prototype.indexOf || (Array.prototype.indexOf = function(d, e) { var a; if (null == this) throw new TypeError('"this" is null or not defined'); var c = Object(this), b = c.length >>> 0; if (0 === b) return -1; a = +e || 0; Infinity === Math.abs(a)  (a = 0); if (a >= b) return -1; for (a = Math.max(0 <= a ? a : b - Math.abs(a), 0); a < b;) { if (a in c  c[a] === d) return a; a++ } return -1 }); 
9765
24 апр. Die Antwort wurde von Tom Wadley am 24. April gegeben 2011-04-24 01:23 '11 at 1:23 2011-04-24 01:23

Ich weiß nicht, wie Sie erwarten, dass sich array.remove(int) verhalten wird. Es gibt drei Möglichkeiten, über die Sie nachdenken können.

So entfernen Sie ein Array-Element mit einem Index von i :

 array.splice(i, 1); 

Wenn Sie jedes Element mit einem Zahlenwert aus dem Array entfernen möchten:

border=0
 for(var i = array.length - 1; i >= 0; i--) { if(array[i] === number) { array.splice(i, 1); } } 

Wenn Sie nur ein Element mit einem Index erstellen möchten, existiert i nicht mehr, Sie möchten jedoch nicht, dass sich die Indizes anderer Elemente ändern:

 delete array[i]; 
990
24 апр. Antwort von Peter Olson am 24. April 2011-04-24 01:20 '11 at 1:20 2011-04-24 01:20

Bearbeitet 2016 Oktober

  • Machen Sie es einfach, intuitiv und explizit ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Machen Sie es unverändert (das ursprüngliche Array bleibt unverändert)
  • Verwenden Sie die Standardfunktionen von JS, wenn Ihr Browser sie nicht unterstützt - verwenden Sie polyfill

In diesem Codebeispiel verwende ich die Funktion array.filter (...) , um unerwünschte Elemente aus einem Array zu entfernen. Diese Funktion ändert das ursprüngliche Array nicht und erstellt ein neues Array. Wenn Ihr Browser diese Funktion nicht unterstützt (z. B. IE bis Version 9 oder Firefox zuvor) Version 1.5), sollten Sie den Mozilla-Polyfill-Filter verwenden .

Artikel löschen (ECMA-262 Edition 5-Code alias oldstyle JS)

 var value = 3 var arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(function(item) { return item !== value }) console.log(arr) // [ 1, 2, 4, 5 ] 

Artikel löschen (ES2015-Code)

 let value = 3 let arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(item => item !== value) console.log(arr) // [ 1, 2, 4, 5 ] 

WICHTIG ES2015 "() => {}" Die Pfeilfunktionssyntax wird in IE im Allgemeinen nicht unterstützt. Chrome bis Version 45, Firefox bis Version 22, Safari bis Version 10. Um die ES2015-Syntax in älteren Browsern zu verwenden, können Sie BabelJS verwenden


Mehrere Elemente löschen (ES2016-Code)

Ein zusätzlicher Vorteil dieser Methode ist, dass Sie mehrere Elemente löschen können.

 let forDeletion = [2, 3, 5] let arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(item => !forDeletion.includes(item)) // !!! Read below about array.includes(...) support !!! console.log(arr) // [ 1, 4 ] 

WICHTIG "array.includes (...)" wird in IE überhaupt nicht unterstützt, Chrome bis Version 47, Firefox bis Version 43, Safari bis Version 9 und Edge bis Version 14, daher hier die Mozilla-Polyfields

Mehrere Elemente entfernen (fortgeschrittenes experimentelles Javascript ES2018?)

 // array-lib.js export function remove(...forDeletion) { return this.filter(item => !forDeletion.includes(item)) } // main.js import { remove } from './array-lib.js' let arr = [1, 2, 3, 4, 5, 3] // :: This-Binding Syntax Proposal // using "remove" function as "virtual method" // without extending Array.prototype arr = arr::remove(2, 3, 5) console.log(arr) // [ 1, 4 ] 

50 builtIns = false code = Funktion remove (... forDeletion) {return this.filter (item =>! ForDeletion.includes (item))} let arr = [1, 2, 3, 4, 5, 3] // :: This-Binding Syntax Proposal // Verwendung von remove-Funktion als "virtuelle Methode" arr = arr :: remove (2, 3, 5) console.log (arr) // [1, 4] rel = noreferrer> Versuchen Sie es selbst in BabelJS: )

Hilfe

814
19 дек. Die Antwort wird am 19. Dezember von Ujeenator gegeben . 2013-12-19 22:54 '13 um 22:54 Uhr 2013-12-19 22:54

Abhängig davon, ob Sie leeren Platz sparen möchten oder nicht.

Wenn Sie einen leeren Steckplatz benötigen, ist das Entfernen in Ordnung:

 delete array[ index ]; 

Wenn Sie dies nicht tun, sollten Sie die Splice- Methode verwenden:

 array.splice( index, 1 ); 

Wenn Sie den Wert dieses Elements benötigen, können Sie das zurückgegebene Element des Arrays einfach speichern:

 var value = array.splice( index, 1 )[0]; 

Wenn Sie dies in einer bestimmten Reihenfolge tun möchten, können Sie array.pop() für letzteres oder array.shift() für das erste verwenden (und beide geben auch den Wert des Elements zurück).

Wenn Sie den Index eines Elements nicht kennen, können Sie array.indexOf( item ) , um ihn zu erhalten (in if() , um ein Element zu erhalten, oder in while() , um alle zu erhalten). array.indexOf( item ) gibt entweder einen Index zurück oder -1, falls nicht gefunden.

381
24 апр. Antwort gegeben xavierm02 24. April 2011-04-24 01:32 '11 at 1:32 2011-04-24 01:32 Uhr

Ein Freund hatte ein Problem mit dem Internet Explorer 8 und zeigte mir, was er getan hat. Ich sagte ihm, dass es falsch sei, und er sagte mir, dass er hier eine Antwort erhielt. Die aktuelle Top-Antwort funktioniert nicht in allen Browsern (z. B. Internet Explorer 8) und entfernt nur das erste Vorkommen des Elements.

Entfernen Sie ALLE Instanzen aus dem Array

 function remove(arr, item) { for (var i = arr.length; i--;) { if (arr[i] === item) { arr.splice(i, 1); } } } 

Es bewegt sich rückwärts durch das Array (da sich Indizes und Länge ändern, wenn Elemente entfernt werden) und löscht das Element, wenn es gefunden wird. Es funktioniert in allen Browsern.

249
10 авг. Antwort von Ben Lesh 10. August 2013-08-10 22:21 '13 um 22:21 Uhr 2013-08-10 22:21

Es gibt zwei Hauptansätze:

  • Spleiß () : anArray.splice(index, 1);

  • delete : delete anArray[index];

Seien Sie vorsichtig, wenn Sie delete für ein Array verwenden. Es eignet sich gut zum Entfernen von Objektattributen, aber nicht so gut für Arrays. Verwenden Sie besser splice für Arrays.

anArray.length Sie, dass bei Verwendung von delete für ein Array falsche Ergebnisse für anArray.length . Mit anderen Worten: Mit delete das Element delete der Wert der length-Eigenschaft wird jedoch nicht aktualisiert.

Sie können beispielsweise nach einem Löschvorgang auch Lücken in den Indexnummern erwarten. Sie könnten Indizes von 1,3,4,8,9,11 und Länge erhalten, wie vor der Löschung. In diesem Fall werden alle indexierten for Schleifen aufgeteilt, da die Indizes nicht mehr konsistent sind.

Wenn Sie aus irgendeinem Grund delete , müssen Sie for each Schleife verwenden, wenn Sie Arrays durchlaufen müssen. Vermeiden Sie es immer, wenn möglich, indizierte for-Schleifen zu verwenden. Somit ist der Code zuverlässiger und weniger anfällig für Probleme mit Indizes.

140
21 дек. Antwort gegeben Sasa 21 Dez. 2012-12-21 14:32 '12 am 14:32 2012-12-21 14:32
 Array.prototype.remByVal = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] === val) { this.splice(i, 1); i--; } } return this; } //Call like [1, 2, 3, 4].remByVal(3); 

116
24 апр. Die Antwort ist gegeben Zirak 24 April. 2011-04-24 01:20 '11 at 1:20 2011-04-24 01:20

Keine Notwendigkeit, indexOf oder splice . Es funktioniert jedoch besser, wenn Sie nur ein Vorkommen des Elements entfernen möchten.

Finden und bewegen (verschieben):

 function move(arr, val) { var j = 0; for (var i = 0, l = arr.length; i < l; i++) { if (arr[i] !== val) { arr[j++] = arr[i]; } } arr.length = j; } 

Verwenden Sie indexOf und splice (indexof):

 function indexof(arr, val) { var i; while ((i = arr.indexOf(val)) != -1) { arr.splice(i, 1); } } 

Verwenden Sie nur splice :

 function splice(arr, val) { for (var i = arr.length; i--;) { if (arr[i] === val) { arr.splice(i, 1); } } } 

Vorlaufzeit für nodejs für ein Array mit 1000 Elementen (durchschnittlich mehr als 10.000 Durchläufe):

Der Index ist etwa zehnmal >indexOf Aufrufs in einem Spleiß verbessert wird, ist es wesentlich schlechter als das Verschieben.

 Remove all occurrences: move 0.0048 ms indexof 0.0463 ms splice 0.0359 ms Remove first occurrence: move_one 0.0041 ms indexof_one 0.0021 ms 
86
19 сент. Die Antwort wird am 19. September veröffentlicht 2013-09-19 04:53 '13 am 4:53 2013-09-19 04:53

Der einfachste Weg:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. Die Antwort wird von Nanego 02 Dez. gegeben. 2017-12-02 20:42 '17 um 20:42 Uhr 2017-12-02 20:42

Zu alt zum Antworten, aber kann er jemandem helfen, indem er statt eines Wertes ein Prädikat bereitstellt.

HINWEIS: Das Array wird aktualisiert und die betroffenen Zeilen werden zurückgegeben.

Verwendung von

 var removed = helper.removeOne(arr, row => row.id === 5 ); var removed = helper.remove(arr, row => row.name.startsWith('BMW')); 

Definition

 var helper = { // Remove and return the first occurrence removeOne: function(array, predicate) { for (var i = 0; i < array.length; i++) { if (predicate(array[i])) { return array.splice(i, 1); } } }, // Remove and return all occurrences remove: function(array, predicate) { var removed = []; for (var i = 0; i < array.length;) { if (predicate(array[i])) { removed.push(array.splice(i, 1)); continue; } i++; } return removed; } }; 
58
02 мая '14 в 15:00 2014-05-02 15:00 Die Antwort wird am 02. Mai '14 um 15:00 Uhr gegeben. 2014-05-02 15:00 Uhr

John Resig hat eine gute Implementierung veröffentlicht :

 // Array Remove - By John Resig (MIT Licensed) Array.prototype.remove = function(from, to) { var rest = this.slice((to || from) + 1 || this.length); this.length = from < 0 ? this.length + from : from; return this.push.apply(this, rest); }; 

Wenn Sie das globale Objekt nicht erweitern möchten, können Sie wie folgt vorgehen:

 // Array Remove - By John Resig (MIT Licensed) Array.remove = function(array, from, to) { var rest = array.slice((to || from) + 1 || array.length); array.length = from < 0 ? array.length + from : from; return array.push.apply(array, rest); }; 

Der Hauptgrund, warum ich dies veröffentliche, ist, die Benutzer vor der alternativen Implementierung zu warnen, die in den Kommentaren auf dieser Seite (14. Dezember 2007) vorgeschlagen wird:

 Array.prototype.remove = function(from, to){ this.splice(from, (to=[0,from||1,++to-from][arguments.length])<0?this.length+to:to); return this.length; }; 

Es scheint anfangs gut zu funktionieren, aber durch den schmerzhaften Prozess entdeckte ich, dass es nicht funktionierte und versuchte, das vorletzte Element im Array zu entfernen. Wenn Sie beispielsweise ein Array mit 10 Elementen haben und versuchen, das 9. Element folgendermaßen zu entfernen:

 myArray.remove(8); 

Als Ergebnis erhalten Sie ein 8-Element-Array. Ich weiß nicht warum, aber ich habe bestätigt, dass die ursprüngliche Implementierung von John dieses Problem nicht hat.

55
30 авг. Die Antwort wird Roger 30 gegeben. 2013-08-30 22:07 13 um 22:07 Uhr 2013-08-30 22:07

Underscore.js kann verwendet werden, um Probleme mit mehreren Browsern zu lösen. Falls vorhanden, werden die im Browser integrierten Methoden verwendet. Wenn sie fehlen, wie dies bei älteren Versionen von Internet Explorer der Fall ist, werden eigene Methoden verwendet.

Ein einfaches Beispiel zum Entfernen von Elementen aus einem Array (von einer Website):

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4] 
53
30 мая '14 в 12:57 2014-05-30 12:57 Die Antwort wird von vatsal am 30. Mai '14 um 12:57 2014-05-30 12:57 gegeben

Sie können dies einfach mit der Filtermethode tun:

 function remove(arrOriginal, elementToRemove){ return arrOriginal.filter(function(el){return el !== elementToRemove}); } console.log( remove([1, 2, 1, 0, 3, 1, 4], 1) ); 

Dadurch werden alle Elemente aus dem Array entfernt und funktionieren auch schneller als die Kombination Slice und IndexOf.

52
11 февр. Die Antwort wird von Salvador Dali 11 Feb. gegeben. 2014-02-11 01:06 '14 um 1:06 2014-02-11 01:06

Wenn Sie ein neues Array mit gelöschten Positionen löschen möchten, können Sie jederzeit ein bestimmtes Element löschen und das Array filtern. Möglicherweise müssen Sie das Array- Objekt für Browser erweitern, die die Filtermethode nicht implementieren. Auf >

 var my_array = [1,2,3,4,5,6]; delete my_array[4]; console.log(my_array.filter(function(a){return typeof a !== 'undefined';})); 

Muss anzeigen [1, 2, 3, 4, 6]

40
18 окт. Antwort Loupax 18. Oktober 2012-10-18 13:13 '12 am 13:13 2012-10-18 13:13

Sie können ES6 verwenden.

 var array=['1','2','3','4','5','6'] var index = array.filter((value)=>value!='3'); 

Ausfahrt:

 ["1", "2", "4", "5", "6"] 
37
04 окт. die antwort ist gegeben rajat44 04 oct. 2016-10-04 11:07 '16 am 11:07 2016-10-04 11:07

Überprüfen Sie diesen Code. Es funktioniert in jedem größeren Browser. .

 remove_item = function (arr, value) { var b = ''; for (b in arr) { if (arr[b] === value) { arr.splice(b, 1); break; } } return arr; } 

Rufen Sie diese Funktion auf

 remove_item(array,value); 
34
02 апр. Die Antwort wird von Ekramul Hoque 02 Apr. gegeben. 2013-04-02 13:56 '13 am 13:56 2013-04-02 13:56

Sie können lodash _ verwenden. pull ( mutate array), _.pullAt ( mutate array) oder _. ohne (verändert das Array nicht),

 var array1 = ['a', 'b', 'c', 'd'] _.pull(array1, 'c') console.log(array1) // ['a', 'b', 'd'] var array2 = ['e', 'f', 'g', 'h'] _.pullAt(array2, 0) console.log(array2) // ['f', 'g', 'h'] var array3 = ['i', 'j', 'k', 'l'] var newArray = _.without(array3, 'i') // ['j', 'k', 'l'] console.log(array3) // ['i', 'j', 'k', 'l'] 
32
25 авг. Die Antwort ist gegeben Chun Yang 25 aug. 2015-08-25 22:34 '15 um 22:34 Uhr 2015-08-25 22:34

OK, zum Beispiel haben Sie ein Array darunter:

 var num = [1, 2, 3, 4, 5]; 

Und wir möchten die Nummer 4 löschen, Sie können einfach den folgenden Code eingeben:

 num.splice(num.indexOf(4), 1); //num will be [1, 2, 3, 5]; 

Wenn Sie diese Funktion wiederverwenden, schreiben Sie eine Wiederverwendungsfunktion, die an die native Array-Funktion gebunden ist, wie unten gezeigt:

 Array.prototype.remove = Array.prototype.remove || function(x) { const i = this.indexOf(x); if(i===-1) return; this.splice(i, 1); //num.remove(5) === [1, 2, 3]; } 

Aber wie wäre es, wenn Sie unten ein Array und einige [5] s im Array haben?

 var num = [5, 6, 5, 4, 5, 1, 5]; 

Wir benötigen eine Schleife, um sie alle zu überprüfen, aber es ist einfacher und effizienter, die integrierten JavaScript-Funktionen zu verwenden. Daher schreiben wir eine Funktion, die einen Filter verwendet, wie unten gezeigt:

 const _removeValue = (arr, x) => arr.filter(n => n!==x); //_removeValue([1, 2, 3, 4, 5, 5, 6, 5], 5) //return [1, 2, 3, 4, 6] 

Es gibt auch Bibliotheken von Drittanbietern, die Sie dabei unterstützen, wie z. B. Lodash oder Underscore. Dort finden Sie weitere Informationen zu lodash _.pull, _.pullAt oder _.without.

32
10 мая '17 в 12:39 2017-05-10 12:39 Die Antwort wird von Alireza am 10. Mai 17 um 12:39 2017-05-10 12:39 gegeben

Ich bin neu bei Javascript und brauche diese Funktion. Ich habe gerade das geschrieben:

 function removeFromArray(array, item, index) { while((index = array.indexOf(item)) > -1) { array.splice(index, 1); } } 

Dann, wenn ich es verwenden möchte:

 //Set-up some dummy data var dummyObj = {name:"meow"}; var dummyArray = [dummyObj, "item1", "item1", "item2"]; //Remove the dummy data removeFromArray(dummyArray, dummyObj); removeFromArray(dummyArray, "item2"); 

Beenden Sie - wie erwartet. ["item1", "item1"]

Möglicherweise haben Sie andere Bedürfnisse als ich, sodass Sie sie leicht an Ihre Bedürfnisse anpassen können. Hoffe das hilft jemandem.

27
16 янв. Die Antwort gibt Sofiax am 16. Januar 2014-01-16 14:27 '14 um 14:27 2014-01-16 14:27

ES6 und ohne Mutation: (Oktober 2016)

 const removeByIndex = (list, index) => [ ...list.slice(0, index), ...list.slice(index + 1) ]; 

Dann:

 removeByIndex([33,22,11,44],1) //=> [33,11,44] 
24
07 окт. Antwort von Abdennour TOUMI Okt. 07 2016-10-07 22:42 '16 um 22:42 Uhr 2016-10-07 22:42

Update: Diese Methode wird nur empfohlen, wenn Sie ECMAScript 2015 (früher als ES6 bekannt) nicht verwenden können. Wenn Sie es verwenden können, geben andere Antworten hier viele fortgeschrittene Implementierungen.


Diese Bedeutung löst Ihr Problem und entfernt alle Vorkommen des Arguments, nicht nur 1 (oder den angegebenen Wert).

 Array.prototype.destroy = function(obj){ // Return null if no objects were found and removed var destroyed = null; for(var i = 0; i < this.length; i++){ // Use while-loop to find adjacent equal objects while(this[i] === obj){ // Remove this[i] and store it within destroyed destroyed = this.splice(i, 1)[0]; } } return destroyed; } 

Anwendung:

 var x = [1, 2, 3, 3, true, false, undefined, false]; x.destroy(3); // => 3 x.destroy(false); // => false x; // => [1, 2, true, undefined] x.destroy(true); // => true x.destroy(undefined); // => undefined x; // => [1, 2] x.destroy(3); // => null x; // => [1, 2] 
21
13 марта '13 в 12:28 2013-03-13 12:28 Die Antwort ist gegeben zykadelic 13. März 13 um 12:28 2013-03-13 12:28

Wenn Sie komplexe Objekte in einem Array haben, können Sie Filter verwenden? In Situationen, in denen $ .inArray oder array.splice nicht so einfach zu verwenden ist. Besonders, wenn die Objekte im Array möglicherweise klein sind.

zum beispiel. Wenn Sie ein Objekt mit dem Feld "Id" haben und das Objekt aus dem Array entfernen möchten:

 this.array = this.array.filter(function(element, i) { return element.id !== idToRemove; }); 
20
09 апр. Die Antwort wird fließend 09 April gegeben. 2015-04-09 13:00 15 um 13:00 Uhr 2015-04-09 13:00 Uhr

Es gibt einige Möglichkeiten, um ein Element mit Javascript aus einem Array zu entfernen .

Alle beschriebenen Methoden ändern das ursprüngliche Array nicht und erstellen stattdessen ein neues.

Wenn Sie den Index des Artikels kennen

Angenommen, Sie haben ein Array und möchten ein Element an Position i löschen.

Eine Möglichkeit ist die Verwendung von slice() :

 const items = ['a', 'b', 'c', 'd', 'e', 'f'] const valueToRemove = 'c' const filteredItems = items.filter(item => item !== valueToRemove) console.log(filteredItems) 

Es verwendet die Funktionen von ES6-Pfeilen. Sie können traditionelle Funktionen verwenden, um ältere Browser zu unterstützen:

 const items = ['a', 'b', 'c', 'd', 'e', 'f'] const removeItem = (items, i) => items.slice(0, i-1).concat(items.slice(i, items.length)) let filteredItems = removeItem(items, 3) filteredItems = removeItem(filteredItems, 5) //["a", "b", "c", "d"] console.log(filteredItems) 

Nach Wert

Sie können nach der Aufnahme in der Rückruffunktion suchen:

https://flaviocopes.com/how-to-remove-item-from-array/ ) 

20
04 мая '18 в 8:17 2018-05-04 08:17 Die Antwort wird von Flavio Copes am 04. Mai 18 um 08:17 Uhr gegeben. 2018-05-04 08:17

Sie sollten ein Array-Array niemals mutieren. Weil es dem funktionalen Programmiermuster widerspricht. Sie können ein neues Array ohne Verweis auf das Array erstellen, das Sie mit der ES6- filter ändern möchten.

 var myArray = [1,2,3,4,5,6]; 

Angenommen, Sie möchten 5 aus einem Array entfernen, Sie können dies einfach so tun.

 myArray = myArray.filter(value => value !== 5); 

Dadurch erhalten Sie ein neues Array ohne den Wert, den Sie löschen möchten. Das Ergebnis wird also sein

  [1,2,3,4,6]; // 5 has been removed from this array 

Zum besseren Verständnis können Sie die MDN-Dokumentation unter Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter lesen

19
26 дек. Antwort von Adeel Imran 26. Dezember 2017-12-26 22:32 '17 um 22:32 Uhr 2017-12-26 22:32

Moderneres ECMAScript 2015 (früher bekannt als Harmony oder ES 6). Gegeben:

 const items = [1, 2, 3, 4]; const index = 2; 

Dann:

 items.filter((x, i) => i !== index); 

Abtretung:

 [1, 2, 4] 

Sie können Babel und den Polyfill- Dienst verwenden, damit Browser gut funktionieren .

18
25 апр. die antwort wird vom bjfletcher 25 apr. gegeben . 2016-04-25 13:21 '16 um 13:21 Uhr 2016-04-25 13:21

Ich weiß, dass es bereits viele Antworten gibt, aber viele von ihnen scheinen das Problem zu komplizieren. Hier ist eine einfache, rekursive Methode zum Entfernen aller Instanzen eines Schlüssels. Er ruft self auf, bis ein Index gefunden wird. Ja, es funktioniert nur in Browsern mit indexOf , aber es ist einfach und kann problemlos gefüllt werden.

Autonome Funktion

 function removeAll(array, key){ var index = array.indexOf(key); if(index === -1) return; array.splice(index, 1); removeAll(array,key); } 

Prototypmethode

 Array.prototype.removeAll = function(key){ var index = this.indexOf(key); if(index === -1) return; this.splice(index, 1); this.removeAll(key); } 
16
03 февр. Die Antwort wird gegeben28. 2014-02-03 18:41 '14 um 18:41 2014-02-03 18:41

Ich habe eine andere gute Lösung zum Entfernen aus einem Array:

 var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']; const result = words.filter(word => word.length > 6); console.log(result); // expected output: Array ["exuberant", "destruction", "present"] 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

15
05 июня '18 в 17:47 2018-06-05 17:47 antwortete Aram Grigoryan am 5. Juni 1818 um 17:47 Uhr 2018-06-05 17:47

Sie können eine umgekehrte Schleife ausführen, um sicherzustellen, dass Sie die Indizes nicht verdrehen, wenn das Element mehrere Instanzen enthält.

 var myElement = "chocolate"; var myArray = ['chocolate', 'poptart', 'poptart', 'poptart', 'chocolate', 'poptart', 'poptart', 'chocolate'];  for (var i = myArray.length - 1; i >= 0; i--) { if (myArray[i] == myElement) myArray.splice(i, 1); } 

Live-Demo

15
12 авг. die antwort wird von Jeff Noel 12 aug gegeben. 2013-08-12 20:56 '13 um 20:56 2013-08-12 20:56

Basierend auf all den Antworten, die größtenteils korrekt waren, und unter Berücksichtigung der besten Empfehlungen (insbesondere ohne direkte Verwendung von Array.prototype), kam ich zu folgendem Code:

 function arrayWithout(arr, values) { var isArray = function(canBeArray) { if (Array.isArray) { return Array.isArray(canBeArray); } return Object.prototype.toString.call(canBeArray) === '[object Array]'; }; var excludedValues = (isArray(values)) ? values : [].slice.call(arguments, 1); var arrCopy = arr.slice(0); for (var i = arrCopy.length - 1; i >= 0; i--) { if (excludedValues.indexOf(arrCopy[i]) > -1) { arrCopy.splice(i, 1); } } return arrCopy; } 

Bei der Analyse der obigen Funktion stellte ich fest, dass die Leistung verbessert werden kann, obwohl sie einwandfrei funktioniert. Auch die Verwendung von ES6 anstelle von ES5 ist ein viel besserer Ansatz. Для этого это улучшенный код:

 const arrayWithoutFastest = (() => { const isArray = canBeArray => ('isArray' in Array) ? Array.isArray(canBeArray) : Object.prototype.toString.call(canBeArray) === '[object Array]'; let mapIncludes = (map, key) => map.has(key); let objectIncludes = (obj, key) => key in obj; let includes; function arrayWithoutFastest(arr, ...thisArgs) { let withoutValues = isArray(thisArgs[0]) ? thisArgs[0] : thisArgs; if (typeof Map !== 'undefined') { withoutValues = withoutValues.reduce((map, value) => map.set(value, value), new Map()); includes = mapIncludes; } else { withoutValues = withoutValues.reduce((map, value) => { map[value] = value; return map; } , {}); includes = objectIncludes; } const arrCopy = []; const length = arr.length; for (let i = 0; i < length; i++) { // If value is not in exclude list if (!includes(withoutValues, arr[i])) { arrCopy.push(arr[i]); } } return arrCopy; } return arrayWithoutFastest; })(); 

Как пользоваться:

 const arr = [1,2,3,4,5,"name", false]; arrayWithoutFastest(arr, 1); // will return array [2,3,4,5,"name", false] arrayWithoutFastest(arr, 'name'); // will return [2,3,4,5, false] arrayWithoutFastest(arr, false); // will return [2,3,4,5] arrayWithoutFastest(arr,[1,2]); // will return [3,4,5,"name", false]; arrayWithoutFastest(arr, {bar: "foo"}); // will return the same array (new copy) 

В настоящее время я пишу сообщение в блоге, в котором проверил несколько решений для Array без проблем и сравнил время, необходимое для запуска. Я дополню этот ответ ссылкой, как только закончу этот пост. Просто чтобы вы знали, я сравнил вышеупомянутое с lodash без, и если браузер поддерживает Map , он превосходит lodash! Обратите внимание, что я не использую Array.prototype.indexOf или Array.prototype.includes поскольку обертывание exlcudeValues в Map или Object ускоряет выполнение запросов!

15
ответ дан Ardi 28 янв. '14 в 17:44 2014-01-28 17:44
  Array.prototype.removeItem = function(a) { for (i = 0; i < this.length; i++) { if (this[i] == a) { for (i2 = i; i2 < this.length - 1; i2++) { this[i2] = this[i2 + 1]; } this.length = this.length - 1 return; } } } var recentMovies = ['Iron Man', 'Batman', 'Superman', 'Spiderman']; recentMovies.removeItem('Superman'); 
13
ответ дан Don Vincent Preziosi 26 сент. '13 в 3:12 2013-09-26 03:12
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос