WARNUNG : Einige der am besten bewerteten Antworten können Nebenwirkungen haben, z. B. falsche Operationen, wenn das Array das zu entfernende Element nicht enthält. Bitte verwenden Sie sie mit Vorsicht .
Siehe meinen Kommentar unter der Verwendung von splice () und $ .inArray (). Ich habe dieses Problem OHNE Verwendung einer Schleife gelöst und es ist sauber.
Das sind gute Nachrichten und ja, die richtige Modifikation wurde benötigt :)
Sarfraz
2
Ich denke, dass die Antwort von @ user113716 in Bezug auf die Standard-JS-Methode der richtige Weg ist. Jede native Methode wird immer bevorzugt und schneller.
Neoswf
114
Ist diese Antwort nicht völlig falsch? Es wird ein neues Array mit einem fehlenden Element erstellt und kein Element aus dem Array entfernt. Das ist überhaupt nicht dasselbe.
James Moore
5
Das ist eine Entfernung mit einer Komplexität von O (n) ... je mehr Werte im Array, desto schlimmer wird es sein ...
Lyth
2
Die Komplexität von O (n) ist kein Problem.
Omar Tariq
370
Mit jQuery können Sie eine einzeilige Operation wie folgt ausführen:
@Elankeeran - Gern geschehen. : o) Ich sollte beachten, dass dadurch nur die erste Instanz entfernt wird. Wenn mehrere entfernt werden müssen, würde dies nicht funktionieren.
user113716
7
Ich habe auch das removeItem in einen Wert geändert, der NICHT im Array vorhanden ist, und das letzte Element im Array entfernt. Verwenden Sie diese Option, wenn Sie nicht sicher sind, ob das entfernte Element vorhanden ist: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn
52
WARNUNG - Kann falsche Gegenstände entfernen! $ .inArray gibt -1 zurück, wenn der Wert nicht vorhanden ist, und .splice behandelt einen negativen Index als 'vom Ende'. Wenn der Wert, den Sie entfernen möchten, nicht vorhanden ist, wird stattdessen ein anderer Wert entfernt. Außerdem entfernt $ .grep alle Vorkommen, während diese Methode nur das erste entfernt.
Ryan Williams
1
Um beide oben beschriebenen Probleme zu beheben, verwenden Sie eine whileSchleife und eine temporäre Variable wie var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
1
Obwohl es mit ES5 viel besser ist als .indexOf()mit jQuery, weil Sie den zuletzt gefundenen Index als Ausgangspunkt für die nächste Suche verwenden können, was weitaus effizienter ist, als jedes Mal das gesamte Array zu durchsuchen. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
50
jQuery.filterMethode ist nützlich. Dies ist für ArrayObjekte verfügbar .
var arr =[1,2,3,4,5,5];var result = arr.filter(function(elem){return elem !=5;});//result -> [1,2,3,4]
Scheint das Beste aus den vorgeschlagenen Lösungen herauszuholen, obwohl das vorhandene Array nicht geändert, sondern ein neues erstellt wird. Es funktioniert auch mit nicht vorhandenen Werten oder einem leeren Array. Schnelle Leistungsprüfung in JSFiddle, die ich durchgeführt habe: Bei einem Array mit 800.000 Werten dauerte die Fertigstellung etwa 6 Sekunden. Ich bin mir nicht sicher, ob das schnell geht.
Flo
1
Diese Lösung verwendet einen Vanilla JS-Funktionsfilter hoher Ordnung, NICHT die jQuery-Filtermethode.
Kalimah
Ich liebe es! Es scheint die beste Lösung zu sein, obwohl es nicht jquery ist ...
Array.prototype.remove=function(v){this.splice(this.indexOf(v)==-1?this.length :this.indexOf(v),1);}var a =['a','b','c'];
a.remove('c');//value of "a" is now ['a','b']
//This prototype function allows you to remove even array from arrayArray.prototype.remove=function(x){var i;for(i inthis){if(this[i].toString()== x.toString()){this.splice(i,1)}}}
Ein bisschen mehr Erklärung würde hier nicht fehlen!
Gaz Winter
Um diese Prototypfunktion verwenden zu können, müssen Sie sie in Ihren Code einfügen. Dann können Sie es auf jedes Array mit 'Punktnotation' anwenden, zum Beispiel: someArr.remove ('elem1')
yesnik
3
Das einzige Problem bei so etwas ist, dass die Entfernungsmethode des globalen Array-Objekts überschrieben wird. Dies bedeutet, dass jeder andere Code im Projekt, der vom Standardverhalten abhängt, zu einem fehlerhaften Verhalten führt.
jmort253
2
Ein weiteres Problem ist, dass die globale Variable iüberschrieben wird.
Roland Illig
5
In Javascript gibt es keine native Möglichkeit, dies zu tun. Sie können stattdessen eine Bibliothek verwenden oder eine kleine Funktion schreiben: http://ejohn.org/blog/javascript-array-remove/
Dadurch wird das gesamte Array gelöscht, wenn der Wert nicht vorhanden ist. Ein searchValue = 4 gibt also ein leeres Array zurück.
Julian K
3
Ich habe den Code in jsfiddle kopiert, searchValuein 4 geändert , den Code ausgeführt, kein Problem festgestellt. Alle Werte waren noch vorhanden. @ JulianK
RST
4
Meine Version der Antwort von user113716. Er entfernt einen Wert, wenn keine Übereinstimmung gefunden wird, was nicht gut ist.
var y =[1,2,3]var removeItem =2;var i = $.inArray(removeItem,y)if(i >=0){
y.splice(i,1);}
alert(y);
Dadurch wird jetzt 1 Element entfernt, wenn eine Übereinstimmung gefunden wird, 0, wenn keine Übereinstimmungen gefunden werden.
Wie es funktioniert:
$ .inArray (Wert, Array) ist eine jQuery-Funktion, die den ersten Index von a valuein einem findetarray
Der obige Wert gibt -1 zurück, wenn der Wert nicht gefunden wird. Überprüfen Sie daher, ob i ein gültiger Index ist, bevor Sie ihn entfernen. Das Entfernen von Index -1 bedeutet das Entfernen des letzten, was hier nicht hilfreich ist.
.splice (Index, Anzahl) entfernt die countAnzahl der Werte ab index, daher möchten wir nur eine countvon1
//in case somebody needs something like this: multidimensional array (two items)var ar =[[0,'a'],[1,'b'],[2,'c'],[3,'d'],[4,'e'],[5,'f']];var removeItem =3;
ar = jQuery.grep(ar,function(n){return n[0]!= removeItem;//or n[1] for second item in two item array});
ar;
Index Erforderlich. Eine Ganzzahl, die angibt, an welcher Position Elemente hinzugefügt / entfernt werden sollen. Verwenden Sie negative Werte, um die Position am Ende des Arrays anzugeben
wie viele erforderlich. Die Anzahl der zu entfernenden Elemente. Bei der Einstellung 0 werden keine Elemente entfernt
item1, ..., itemX Optional. Die neuen Elemente, die dem Array hinzugefügt werden sollen
Beachten Sie, dass die folgenden js ein oder mehrere übereinstimmende Elemente aus dem angegebenen Array entfernen, wenn sie gefunden werden. Andernfalls wird das letzte Element des Arrays nicht entfernt.
var x =[1,2,3,4,5,4,4,6,7];var item =4;var startItemIndex = $.inArray(item, x);var itemsFound = x.filter(function(elem){return elem == item;}).length;
Oder
var itemsFound = $.grep(x,function(elem){return elem == item;}).length;
Jetzt über der Zeile wird dieses Element aus dem Array entfernt, wenn es gefunden wird. Um die folgende Logik zusammenzufassen, ist der erforderliche Code zum Überprüfen und Entfernen des Elements aus dem Array.
/** SUBTRACT ARRAYS **/function subtractarrays(array1, array2){var difference =[];for(var i =0; i < array1.length; i++){if( $.inArray( array1[i], array2 )==-1){
difference.push(array1[i]);}}return difference;}
Sie können die Funktion dann an einer beliebigen Stelle in Ihrem Code aufrufen.
var I_like =["love","sex","food"];var she_likes =["love","food"];
alert("what I like and she does't like is: "+ subtractarrays( I_like, she_likes ));//returns "Naughty :P"!
Dies funktioniert in allen Fällen und vermeidet die Probleme bei den oben genannten Methoden. Ich hoffe, das hilft!
Die zweithäufigste Antwort hier ist auf dem Weg, der einer einzeiligen jQuery-Methode des beabsichtigten Verhaltens, das das OP wünscht, am nächsten kommt, aber sie sind am Ende ihres Codes gestolpert, und es hat einen Fehler. Wenn sich Ihr zu entfernendes Element nicht tatsächlich im Array befindet, wird das letzte Element entfernt.
Einige haben dieses Problem bemerkt, und einige haben Möglichkeiten angeboten, sich durchzuschleifen, um sich davor zu schützen. Ich biete die kürzeste und sauberste Methode an, die ich finden konnte, und ich habe unter ihrer Antwort kommentiert, wie der Code gemäß dieser Methode repariert werden kann.
var x =[1,2,"bye",3,4];var y =[1,2,3,4];var removeItem ="bye";// Removing an item that exists in array
x.splice( $.inArray(removeItem,x), $.inArray(removeItem,x));// This is the one-liner used// Removing an item that DOESN'T exist in array
y.splice( $.inArray(removeItem,y), $.inArray(removeItem,y));// Same usage, different array// OUTPUT -- both cases are expected to be [1,2,3,4]
alert(x +'\n'+ y);
Array x entfernt leicht das Element "bye" und Array y bleibt unberührt.
Die Verwendung des Arguments $.inArray(removeItem,array)als zweites Argument ergibt tatsächlich die Länge zum Spleißen. Da das Element nicht gefunden wurde, wird dies ausgewertet array.splice(-1,-1);, was nur dazu führt, dass nichts gespleißt wird ... alles ohne dass dafür eine Schleife geschrieben werden muss.
So entfernen Sie 2 mit Vanille-JavaScript sicher aus dem Array:
// Define polyfill for browsers that don't natively support Array.indexOf()if(!Array.prototype.indexOf){Array.prototype.indexOf =function(searchElement, fromIndex){var k;if(this===null){thrownewTypeError('"this" is null or not defined');}var O =Object(this),
len = O.length >>>0;if(len===0)return-1;var n =+fromIndex ||0;if(Math.abs(n)===Infinity) n =0;if(n >= len)return-1;
k =Math.max(n >=0? n : len -Math.abs(n),0);while(k < len){if(k in O && O[k]===searchElement)return k;++k;}return-1;};}// Remove first instance of 2 from arrayif(y.indexOf(2)>-1){
y.splice(y.indexOf(2),1);}/* To remove all instances of 2 from array, change 'if' to 'while':
while (y.indexOf(2) > -1) {
y.splice(y.indexOf(2), 1);
}
*/
console.log(y);// Returns [1, 3]
Antworten:
Ein funktionierendes JSFIDDLE
Sie können so etwas tun:
Ergebnis:
http://snipplr.com/view/14381/remove-item-from-array-with-jquery/
quelle
Mit jQuery können Sie eine einzeilige Operation wie folgt ausführen:
Beispiel: http://jsfiddle.net/HWKQY/
Verwendet die native
.splice()
und jQuery's$.inArray()
.quelle
while
Schleife und eine temporäre Variable wievar found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
.indexOf()
mit jQuery, weil Sie den zuletzt gefundenen Index als Ausgangspunkt für die nächste Suche verwenden können, was weitaus effizienter ist, als jedes Mal das gesamte Array zu durchsuchen.var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
jQuery.filter
Methode ist nützlich. Dies ist fürArray
Objekte verfügbar .http://jsfiddle.net/emrefatih47/ar0dhvhw/
In Ecmascript 6:
https://jsfiddle.net/emrefatih47/nnn3c2fo/
quelle
Sie können underscore.js verwenden . Es macht die Dinge wirklich einfach.
In Ihrem Fall ist der gesamte Code, den Sie schreiben müssen, -
und das Ergebnis wird [1,3] sein.
Es reduziert den Code, den Sie schreiben.
quelle
Kein jQuery-Weg, aber ... Warum nicht einen einfacheren Weg verwenden? Entfernen Sie 'c' aus dem folgenden Array
Sie können auch Folgendes verwenden: (Hinweis für mich: Ändern Sie keine Objekte, die Sie nicht besitzen. )
Das Hinzufügen ist einfacher
a.push('c')
quelle
Element im Array entfernen
quelle
Anwendungsbeispiel
Um diese Prototypfunktion verwenden zu können, müssen Sie sie in Ihren Code einfügen. Dann können Sie es auf jedes Array mit 'Punktnotation' anwenden:
quelle
i
überschrieben wird.In Javascript gibt es keine native Möglichkeit, dies zu tun. Sie können stattdessen eine Bibliothek verwenden oder eine kleine Funktion schreiben: http://ejohn.org/blog/javascript-array-remove/
quelle
Sie können die .not-Funktion folgendermaßen verwenden:
quelle
searchValue
in 4 geändert , den Code ausgeführt, kein Problem festgestellt. Alle Werte waren noch vorhanden. @ JulianKMeine Version der Antwort von user113716. Er entfernt einen Wert, wenn keine Übereinstimmung gefunden wird, was nicht gut ist.
Dadurch wird jetzt 1 Element entfernt, wenn eine Übereinstimmung gefunden wird, 0, wenn keine Übereinstimmungen gefunden werden.
Wie es funktioniert:
value
in einem findetarray
count
Anzahl der Werte abindex
, daher möchten wir nur einecount
von1
quelle
quelle
Es gibt eine einfache Lösung mit Spleiß. Laut W3School folgt die Spleißsyntax ;
Index Erforderlich. Eine Ganzzahl, die angibt, an welcher Position Elemente hinzugefügt / entfernt werden sollen. Verwenden Sie negative Werte, um die Position am Ende des Arrays anzugeben
wie viele erforderlich. Die Anzahl der zu entfernenden Elemente. Bei der Einstellung 0 werden keine Elemente entfernt
item1, ..., itemX Optional. Die neuen Elemente, die dem Array hinzugefügt werden sollen
Beachten Sie, dass die folgenden js ein oder mehrere übereinstimmende Elemente aus dem angegebenen Array entfernen, wenn sie gefunden werden. Andernfalls wird das letzte Element des Arrays nicht entfernt.
Oder
Das Finale sollte also wie folgt aussehen
Hoffe das hilft.
quelle
quelle
Ich hatte eine ähnliche Aufgabe, bei der ich mehrere Objekte gleichzeitig löschen musste, basierend auf einer Eigenschaft der Objekte im Array.
Nach ein paar Iterationen habe ich also:
quelle
Ich würde die Array-Klasse um eine
pick_and_remove()
Funktion erweitern, wie folgt:Während es ein bisschen ausführlich erscheinen mag, können Sie jetzt
pick_and_remove()
jedes Array aufrufen, das Sie möglicherweise wollen!Verwendungszweck:
All dies können Sie hier in Pokemon-Action sehen.
quelle
Sie können die Funktion dann an einer beliebigen Stelle in Ihrem Code aufrufen.
Dies funktioniert in allen Fällen und vermeidet die Probleme bei den oben genannten Methoden. Ich hoffe, das hilft!
quelle
Versuchen Sie dies, es funktioniert für mich
quelle
Die zweithäufigste Antwort hier ist auf dem Weg, der einer einzeiligen jQuery-Methode des beabsichtigten Verhaltens, das das OP wünscht, am nächsten kommt, aber sie sind am Ende ihres Codes gestolpert, und es hat einen Fehler. Wenn sich Ihr zu entfernendes Element nicht tatsächlich im Array befindet, wird das letzte Element entfernt.
Einige haben dieses Problem bemerkt, und einige haben Möglichkeiten angeboten, sich durchzuschleifen, um sich davor zu schützen. Ich biete die kürzeste und sauberste Methode an, die ich finden konnte, und ich habe unter ihrer Antwort kommentiert, wie der Code gemäß dieser Methode repariert werden kann.
Array x entfernt leicht das Element "bye" und Array y bleibt unberührt.
Die Verwendung des Arguments
$.inArray(removeItem,array)
als zweites Argument ergibt tatsächlich die Länge zum Spleißen. Da das Element nicht gefunden wurde, wird dies ausgewertetarray.splice(-1,-1);
, was nur dazu führt, dass nichts gespleißt wird ... alles ohne dass dafür eine Schleife geschrieben werden muss.quelle
So entfernen Sie 2 mit Vanille-JavaScript sicher aus dem Array:
Polyfill-Quelle: Mozilla
quelle
Nur um die Antwort von Sarfraz zu ergänzen: Überrascht hat es noch niemand in eine Funktion geschafft.
Verwenden Sie die Antwort von ddagsan mit der .filter-Methode, wenn Sie denselben Wert mehrmals in Ihrem Array haben.
quelle