Pregunta ¿Cómo eliminar el elemento de la matriz por valor?


¿Hay algún método para eliminar un elemento de una matriz de JavaScript?

Dado un conjunto:

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

Me gustaría hacer algo como:

removeItem('seven', ary);

He investigado splice() pero eso solo se elimina por el número de posición, mientras que necesito algo para eliminar un elemento por su valor.


637
2017-10-17 17:43


origen


Respuestas:


Esta puede ser una función global o un método de un objeto personalizado, si no tiene permiso para agregar a prototipos nativos. Elimina todos los elementos de la matriz que coinciden con cualquiera de los argumentos.

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
*/

Para que sea global-

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
*/

Y para cuidar IE8 y abajo-

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

386
2017-10-17 20:16



Puedes usar el indexOf método Me gusta esto:

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

Nota: Tendrás que calzarlo para IE8 y debajo

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

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

console.log(array)


1159
2017-10-17 17:45



Un trazador de líneas lo hará,

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

Esto hace uso de la filtrar función en JS. Es compatible con IE9 y superior.

Qué hace (desde el enlace de doc)

filter () llama a una función de devolución de llamada proporcionada una vez para cada elemento de una matriz, y construye una nueva matriz de todos los valores para los cuales la devolución de llamada devuelve un valor que coacciona a verdadero. la devolución de llamada se invoca solo para los índices de la matriz que tienen valores asignados; no se invoca para los índices que se han eliminado o para los que nunca se han asignado valores. Los elementos de matriz que no pasan la prueba de devolución de llamada simplemente se saltan y no se incluyen en la nueva matriz.

Así que, básicamente, esto es lo mismo que todos los demás for (var key in ary) { ... } soluciones, excepto que el for in constructo es compatible a partir de IE6.

Básicamente, el filtro es un método de conveniencia que se ve mucho mejor (y es encadenable) en comparación con el for in constructo (AFAIK).


248
2017-12-29 16:05



Puedes usar underscore.js. Realmente hace las cosas simples.

Por ejemplo, con esto:

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

Y result estarán ['three','eleven'].

En tu caso, el código que deberás escribir es:

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

Reduce el código que escribes.


121
2018-02-19 09:52



Echa un vistazo de esta manera:

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

y en una función:

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

removeItem(array, 'seven');

44
2017-07-17 17:31



Aquí hay una versión que usa jQuery's Función inArray:

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

34
2017-07-12 09:02



var index = array.indexOf('item');

if(index!=-1){

   array.splice(index, 1);
}

25
2017-11-13 13:49



Lo que buscas es filtro

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

Esto te permitirá hacer lo siguiente:

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

Esto también se observó en este hilo en otro lugar: https://stackoverflow.com/a/20827100/293492


14
2017-08-24 02:15