it-swarm.com.de

Wie entferne ich ein Element vom Wert nach Wert?

Gibt es eine Methode, um ein Element aus einem JavaScript-Array zu entfernen?

Gegeben ein Array:

var ary = ['three', 'seven', 'eleven'];

Ich würde gerne etwas tun wie:

removeItem('seven', ary);

Ich habe mir splice() angesehen, aber das wird nur durch die Positionsnummer entfernt, wohingegen ich etwas brauche, um ein Element nach seinem Wert zu entfernen.

717
MacMac

Dies kann eine globale Funktion oder eine Methode eines benutzerdefinierten Objekts sein, wenn Sie keine Prototypen hinzufügen dürfen. Es entfernt alle Elemente aus dem Array, die mit einem der Argumente übereinstimmen.

Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

var ary = ['three', 'seven', 'eleven'];

ary.remove('seven');

/*  returned value: (Array)
three,eleven
*/

Um es zu einem globalen

function removeA(arr) {
    var what, a = arguments, L = a.length, ax;
    while (L > 1 && arr.length) {
        what = a[--L];
        while ((ax= arr.indexOf(what)) !== -1) {
            arr.splice(ax, 1);
        }
    }
    return arr;
}
var ary = ['three', 'seven', 'eleven'];
removeA(ary, 'seven');


/*  returned value: (Array)
three,eleven
*/

Und um IE8 und unter-

if(!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(what, i) {
        i = i || 0;
        var L = this.length;
        while (i < L) {
            if(this[i] === what) return i;
            ++i;
        }
        return -1;
    };
}
419
kennebec

Sie können die indexOf-Methode wie folgt verwenden:

var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);

Note: Sie müssen es für IE8 und darunter anpassen

var array = [1,2,3,4]
var item = 3

var index = array.indexOf(item);
if (index !== -1) array.splice(index, 1);

console.log(array)

1270
SLaks

Ein Einliner wird es tun,

var ary = ['three', 'seven', 'eleven'];

// Remove item 'seven' from array
var filteredAry = ary.filter(function(e) { return e !== 'seven' })
//=> ["three", "eleven"]

// In ECMA6 (arrow function syntax):
var filteredAry = ary.filter(e => e !== 'seven')

Dazu wird die Funktion filter in JS verwendet. Es wird ab IE9 unterstützt.

Was macht es (aus dem Doc-Link)

filter () ruft eine bereitgestellte Callback-Funktion einmal für jedes Element in einem Array auf und erstellt ein neues Array aller Werte, für die Callback einen Wert zurückgibt, der in true umgewandelt wird. Callback wird nur für Indizes des Arrays aufgerufen, denen Werte zugewiesen wurden. Es wird nicht für Indizes aufgerufen, die gelöscht wurden oder denen noch nie Werte zugewiesen wurden. Array-Elemente, die den Callback-Test nicht bestehen, werden einfach übersprungen und sind nicht im neuen Array enthalten.

Dies ist im Grunde das Gleiche wie bei allen anderen for (var key in ary) { ... }-Lösungen, außer dass das Konstrukt for in ab IE6 unterstützt wird.

Im Grunde ist Filter eine bequeme Methode, die im Vergleich zum for in-Konstrukt (AFAIK) viel schöner aussieht (und kettenfähig ist).

302
John Williams

Sie können underscore.js verwenden. Das macht die Sache wirklich einfach.

Zum Beispiel mit diesem:

var result = _.without(['three','seven','eleven'], 'seven');

Und result wird ['three','eleven'] sein.

In Ihrem Fall lautet der Code, den Sie schreiben müssen:

ary = _.without(ary, 'seven')

Es reduziert den Code, den Sie schreiben.

127
vatsal

Schauen Sie sich diesen Weg an:

for(var i in array){
    if(array[i]=='seven'){
        array.splice(i,1);
        break;
    }
}

und in einer Funktion:

function removeItem(array, item){
    for(var i in array){
        if(array[i]==item){
            array.splice(i,1);
            break;
        }
    }
}

removeItem(array, 'seven');
49
gadlol

Hier ist eine Version, die die Funktion inArray von jQuery verwendet :

var index = $.inArray(item, array);
if (index != -1) {
    array.splice(index, 1);
}
33
CorayThan
var index = array.indexOf('item');

if(index!=-1){

   array.splice(index, 1);
}
27
Kld

Sie können dies auf zwei Arten tun:

var arr = ["1","2","3","4"] // we wanna delete number "3"

zuerst:

arr.indexOf('3') !== -1 && arr.splice(arr.indexOf('3'), 1)

sekunde (ES6):

arr = arr.filter(e => e !== '3')
26
AmerllicA

Was Sie suchen, ist Filter

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

Auf diese Weise können Sie Folgendes tun:

var ary = ['three', 'seven', 'eleven'];
var aryWithoutSeven = ary.filter(function(value) { return value != 'seven' });
console.log(aryWithoutSeven); // returns ['three', 'eleven']

Dies wurde auch an anderer Stelle in diesem Thread erwähnt: https://stackoverflow.com/a/20827100/293492

15
Lotus

Da es keine hübsche gibt, gibt es eine einfache und wiederverwendbare ES6-Funktion.

const removeArrayItem = (arr, itemToRemove) => {
  return arr.filter(item => item !== itemToRemove)
}

Verwendungszweck:

const items = ['orange', 'purple', 'orange', 'brown', 'red', 'orange']
removeArrayItem(items, 'orange')
10
Shakespeare

Wenn Sie eindeutige Werte in Ihrem Array haben und die Reihenfolge keine Rolle spielt, können Sie Set verwenden, und es gibt delete:

var mySet = new Set(['foo']);
mySet.delete('foo'); // Returns true.  Successfully removed.
mySet.has('foo');    // Returns false. The "foo" element is no longer present.
9
greene

ES6 Weg.

const commentsWithoutDeletedArray = commentsArray.filter(comment => comment.Id !== commentId);
7
Oliver Dixon

Einfach

var ary = ['three', 'seven', 'eleven'];
var index = ary.indexOf('seven'); // get index if value found otherwise -1

 if (index > -1) { //if found
   ary.splice(index, 1);
 }
7
Matee Gojra

Das Entfernen aller übereinstimmenden Elemente aus dem Array (anstatt nur das erste Element scheint hier die häufigste Antwort zu sein):

while ($.inArray(item, array) > -1) {
    array.splice( $.inArray(item, array), 1 );
}

Ich habe jQuery für das schwere Heben verwendet, aber Sie haben die Idee, ob Sie nativ werden möchten.

7
Jason

Wirklich, ich kann nicht verstehen, warum das nicht gelöst werden kann

arr = arr.filter(value => value !== 'seven');

Oder vielleicht möchten Sie Vanilla JS verwenden

arr = arr.filter(function(value) { return value !== 'seven' });
7
rbenvenuto

eine sehr saubere Lösung, die in allen Browsern und ohne jegliche Rahmenbedingungen funktioniert, besteht darin, ein neues Array zuzuweisen und es einfach ohne den zu löschenden Eintrag zurückzugeben:

/**
 * @param {Array} array the original array with all items
 * @param {any} item the time you want to remove
 * @returns {Array} a new Array without the item
 */
var removeItemFromArray = function(array, item){
  /* assign a empty array */
  var tmp = [];
  /* loop over all array items */
  for(var index in array){
    if(array[index] !== item){
      /* Push to temporary array if not like item */
      tmp.Push(array[index]);
    }
  }
  /* return the temporary array */
  return tmp;
}
6
mtizziani

Dies erreichen Sie mit der Funktion Lodash_.remove .

var array = ['three', 'seven', 'eleven'];
var evens = _.remove(array, function(e) {
  return e !== 'seven';
});

console.log(evens);
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

4
Yi-Ting Liu

indexOf ist eine Option, aber bei der Implementierung wird im Wesentlichen das gesamte Array nach dem Wert durchsucht, sodass die Ausführungszeit mit der Arraygröße zunimmt. (So ​​ist es in jedem Browser, denke ich, habe ich nur Firefox überprüft).

Ich habe keinen IE6 zum Überprüfen, aber ich würde es als sichere Wette bezeichnen, dass Sie mindestens eine Million Array-Elemente pro Sekunde auf diese Weise auf fast jedem Client-Computer überprüfen können. Wenn [Arraygröße] * [Suchen pro Sekunde] größer als eine Million werden kann, sollten Sie eine andere Implementierung in Betracht ziehen.

Grundsätzlich können Sie ein Objekt verwenden, um einen Index für Ihr Array zu erstellen, z.

var index={'three':0, 'seven':1, 'eleven':2};

Jede vernünftige JavaScript-Umgebung erstellt einen durchsuchbaren Index für solche Objekte, sodass Sie einen Schlüssel schnell in einen Wert konvertieren können, unabhängig davon, wie viele Eigenschaften das Objekt hat.

Dies ist nur die grundlegende Methode. Je nach Bedarf können Sie mehrere Objekte und/oder Arrays kombinieren, um dieselben Daten schnell nach verschiedenen Eigenschaften durchsuchen zu können. Wenn Sie Ihre genauen Anforderungen angeben, kann ich eine spezifischere Datenstruktur vorschlagen.

4
aaaaaaaaaaaa

In allen eindeutigen Werten können Sie:

a = new Set([1,2,3,4,5]) // a = Set(5) {1, 2, 3, 4, 5}
a.delete(3) // a = Set(5) {1, 2, 4, 5} 
[...a] // [1, 2, 4, 5]
3
Eugene Lyzo

Der Trick besteht darin, das Array von Anfang bis Ende durchzugehen, damit Sie beim Entfernen von Elementen die Indizes nicht durcheinanderbringen.

var deleteMe = function( arr, me ){
   var i = arr.length;
   while( i-- ) if(arr[i] === me ) arr.splice(i,1);
}

var arr = ["orange","red","black", "orange", "white" , "orange" ];

deleteMe( arr , "orange");

arr ist jetzt ["rot", "schwarz", "weiß"]

3
chaoticflow

Sie können without oder pull aus Lodash verwenden:

const _ = require('lodash');
_.without([1, 2, 3, 2], 2); // -> [1, 3]
2
sakovias

Zerstörungsfreie Entfernung:

function removeArrayValue(array, value)
{
    var thisArray = array.slice(0); // copy the array so method is non-destructive

    var idx = thisArray.indexOf(value); // initialise idx

    while(idx != -1)
    {
        thisArray.splice(idx, 1); // chop out element at idx

        idx = thisArray.indexOf(value); // look for next ocurrence of 'value'
    }

    return thisArray;
}
2
function removeFrmArr(array, element) {
  return array.filter(e => e !== element);
};
var exampleArray = [1,2,3,4,5];
removeFrmArr(exampleArray, 3);
// return value like this
//[1, 2, 4, 5]
2
Subhojit Mondal

Ich habe die am meisten gewählte Option verwendet und eine Funktion erstellt, die ein Array von Wörtern mit einem anderen Array unerwünschter Wörter bereinigt: 

function cleanArrayOfSpecificTerms(array,unwantedTermsArray) {
  $.each(unwantedTermsArray, function( index, value ) {
    var index = array.indexOf(value);
    if (index > -1) {
      array.splice(index, 1);        
    }
  });
  return array;
}

Führen Sie zur Verwendung folgende Schritte aus: 

var notInclude = ['Not','No','First','Last','Prior','Next', 'dogs','cats'];
var splitTerms = ["call", "log", "dogs", "cats", "topic", "change", "pricing"];

cleanArrayOfSpecificTerms(splitTerms,notInclude)
1
maudulus
let arr = [5, 15, 25, 30, 35];
console.log(arr); //result [5, 15, 25, 30, 35]
let index = arr.indexOf(30);

if (index > -1) {
   arr.splice(index, 1);
}
console.log(arr); //result [5, 15, 25, 35]
1
Asif vora

Verwenden Sie die Variante nicht mit delete - sie macht ein Loch in das Array, da die Elemente nach dem gelöschten Element nicht neu indiziert werden.

> Array.prototype.remove=function(v){
...     delete this[this.indexOf(v)]
... };
[Function]
> var myarray=["3","24","55","2"];
undefined
> myarray.remove("55");
undefined
> myarray
[ '3', '24', , '2' ]
1
Ilya Sher
var remove = function(array, value) {
    var index = null;

    while ((index = array.indexOf(value)) !== -1)
        array.splice(index, 1);

    return array;
};
0

// bearbeitet danke an MarcoCI für die Beratung

versuche dies:

function wantDelete(item, arr){
  for (var i=0;i<arr.length;i++){
    if (arr[i]==item){
      arr.splice(i,1); //this delete from the "i" index in the array to the "1" length
      break;
    }
  }  
}
var goodGuys=wantDelete('bush', ['obama', 'bush', 'clinton']); //['obama', 'clinton']

hoffe das hilft dir

0
julian
//This function allows remove even array from array
var removeFromArr = function(arr, elem) { 
    var i, len = arr.length, new_arr = [],
    sort_fn = function (a, b) { return a - b; };
    for (i = 0; i < len; i += 1) {
        if (typeof elem === 'object' && typeof arr[i] === 'object') {
            if (arr[i].toString() === elem.toString()) {
                continue;
            } else {                    
                if (arr[i].sort(sort_fn).toString() === elem.sort(sort_fn).toString()) {
                    continue;
                }
            }
        }
        if (arr[i] !== elem) {
            new_arr.Push(arr[i]);
        }
    }
    return new_arr;
}

Beispiel für die Verwendung von

var arr = [1, '2', [1 , 1] , 'abc', 1, '1', 1];
removeFromArr(arr, 1);
//["2", [1, 1], "abc", "1"]

var arr = [[1, 2] , 2, 'a', [2, 1], [1, 1, 2]];
removeFromArr(arr, [1,2]);
//[2, "a", [1, 1, 2]]
0
yesnik

Ich habe versucht, die Funktionsmethode von jbaron oben zu verwenden, stellte jedoch fest, dass ich das ursprüngliche Array für die spätere Verwendung intakt halten musste und ein neues Array wie folgt erstellen musste:

var newArray = referenceArray;

erstellt anscheinend per Referenz statt Wert, da beim Entfernen eines Elements aus newArray auch der ReferenzArray entfernt wurde. Also habe ich beschlossen, jedes Mal ein neues Array zu erstellen:

function newArrRemoveItem(array, item, newArray){
    for(var i = 0; i < array.length; i++) {
        if(array[i]!=item){
            newArray.Push(array[i]);
        }
    }
}

Dann verwende ich es so in einer anderen Funktion:

var vesselID = record.get('VesselID');
var otherVessels = new Array();
newArrRemoveItem(vesselArr,vesselID,otherVessels);

Nun bleibt die vesselArr intakt, während das otherVessels-Array jedes Mal, wenn ich den obigen Code ausführt, alle Elemente außer dem neuesten vesselID-Element enthält.

0
Robert

Eine andere Variante:

if (!Array.prototype.removeArr) {
    Array.prototype.removeArr = function(arr) {
        if(!Array.isArray(arr)) arr=[arr];//let's be Nice to people who put a non-array value here.. that could be me!
        var that = this;
        if(arr.length){
            var i=0;
            while(i<that.length){
                if(arr.indexOf(that[i])>-1){
                    that.splice(i,1);
                }else i++;
            }
        }
        return that;
    }
}

Es ist wieder indexOf () in einer Schleife, aber unter der Annahme, dass das zu entfernende Array relativ zu dem zu reinigenden Array klein ist. Jede Entfernung verkürzt die while-Schleife.

0
dkloke

In einer globalen Funktion können wir einen benutzerdefinierten Wert nicht direkt übergeben, es gibt jedoch viele Möglichkeiten, wie unten angegeben

 var ary = ['three', 'seven', 'eleven'];
 var index = ary.indexOf(item);//item: the value which you want to remove

 //Method 1
 ary.splice(index,1);

 //Method 2
 delete ary[index]; //in this method the deleted element will be undefined
0
Srikrushna Pal

CoffeeScript + jQuery-Variante:

arrayRemoveItemByValue = (arr,value) ->
  r=$.inArray(value, arr)
  unless r==-1
    arr.splice(r,1)
  # return
  arr

console.log arrayRemoveItemByValue(['2','1','3'],'3')

es entfernen nur eine, nicht alle.

0
Igor Teterin

Die einfachste Lösung ist:

array.filter(valueForRemove => array.includes(valueForRemove));
0
Jackkobec

Sie können lodash Pull-Funktion verwenden

var ary = ['three', 'seven', 'eleven'];
_.pull(ary, 'seven'); // ['three', 'eleven']
console.log(ary)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>

0
Parth Raval