[javascript] Come rimuovere l'elemento dalla matrice in base al valore?



13 Answers

Puoi usare il metodo indexOf questo modo:

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

Nota : dovrai shimarlo per IE8 e sotto

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

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

console.log(array)

Question

Esiste un metodo per rimuovere un elemento da un array JavaScript?

Dato un array:

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

Mi piacerebbe fare qualcosa come:

removeItem('seven', ary);

Ho esaminato splice() ma questo rimuove solo dal numero di posizione, mentre ho bisogno di qualcosa per rimuovere un oggetto dal suo valore.




Quello che cerchi è il filtro

developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Questo ti permetterà di fare quanto segue:

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

Questo è stato anche notato in questa discussione da qualche altra parte: https://.com/a/20827100/293492




Rimuovendo tutti gli elementi corrispondenti dall'array (piuttosto che solo il primo come sembra essere la risposta più comune qui):

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

Ho usato jQuery per il sollevamento pesi, ma ti viene l'idea se vuoi diventare nativo.




Puoi usare underscore.js . Rende davvero le cose semplici.

Ad esempio, con questo:

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

E il result sarà ['three','eleven'] .

Nel tuo caso il codice che dovrai scrivere è:

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

Riduce il codice che scrivi.




Ecco una versione che utilizza la funzione inArray di jQuery:

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



var remove = function(array, value) {
    var index = null;

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

    return array;
};



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



Un'altra 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;
    }
}

È indexOf () all'interno di un ciclo di nuovo, ma partendo dal presupposto che la matrice da rimuovere è piccola rispetto alla matrice da pulire; ogni rimozione accorcia il ciclo while.




Rimozione non distruttiva:

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;
}



Il trucco è passare attraverso l'array dall'inizio alla fine, in modo da non rovinare gli indici durante la rimozione degli elementi.

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 è ora ["rosso", "nero", "bianco"]




Si prega di non utilizzare la variante con delete : crea un buco nell'array poiché non reindicizza gli elementi dopo l'elemento eliminato.

> 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' ]



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]



Variante CoffeeScript + jQuery:

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

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

rimuove solo uno, non tutto.




Puoi farlo con questi due modi:

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

primo:

a.splice(a.indexOf('3'),1)

secondo (ES6):

a = a.filter(e => e !== '3')



Related