Pregunta ¿Cómo elimino un elemento particular de una matriz en JavaScript?


Tengo una matriz de enteros, y estoy usando .push() método para agregarle elementos

¿Hay una manera simple de eliminar un elemento específico de una matriz? El equivalente de algo así como array.remove(int);.

Tengo que usar núcleo JavaScript - no marcos están permitidos


6102
2018-04-23 22:17


origen


Respuestas:


Encuentra el index del elemento de matriz que desea eliminar, luego elimine ese índice con splice.

El método splice () cambia el contenido de una matriz al eliminar   elementos existentes y / o agregar nuevos elementos.

var array = [2, 5, 9];
var index = array.indexOf(5);
if (index > -1) {
  array.splice(index, 1);
}
// array = [2, 9]

El segundo parámetro de splice es la cantidad de elementos para eliminar. Tenga en cuenta que splice modifica la matriz en su lugar y devuelve una nueva matriz que contiene los elementos que se han eliminado.


Nota: soporte del navegador para indexOf está limitado


8887
2018-04-23 22:23



No sé cómo esperas array.remove(int) a comportarse. Hay tres posibilidades en las que puedo pensar que podría faltar.

Para eliminar un elemento de una matriz en un índice i:

array.splice(i, 1);

Si quieres eliminar cada elemento con valor number de la matriz:

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

Si solo quieres hacer el elemento en el índice i ya no existe, pero no desea que cambien los índices de los otros elementos:

delete array[i];

892
2018-04-23 22:20



Editado en octubre de 2016

  • Hazlo simple, intuitivo y explícito (https://en.wikipedia.org/wiki/Occam%27s_razor)
  • Hazlo inmutable (el conjunto original no se modifica)
  • Hazlo con las funciones estándar de JS, si tu navegador no las admite: usar polyfill

En este ejemplo de código que uso "array.filter (...)" función para eliminar elementos no deseados de la matriz, esta función no cambia la matriz original y crea una nueva. Si su navegador no admite esta función (por ejemplo, IE antes de la versión 9 o Firefox antes que la versión 1.5), considere usar el filtro polyfill de Mozilla.

Extracción del elemento (ECMA-262 Edition 5 code aka 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 ]

Quitar elemento (código ES2015)

let value = 3

let arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(item => item !== value)

console.log(arr)
// [ 1, 2, 4, 5 ]

IMPORTANTE La sintaxis de la función de flecha de ES2015 "() => {}" no es compatible con IE, Chrome antes de la versión 45, Firefox antes de la versión 22, Safari antes de la versión 10. Para usar la sintaxis ES2015 en navegadores antiguos, puede usar BabelJS


Eliminar elementos múltiples (código ES2016)

Una ventaja adicional de este método es que puedes eliminar varios elementos

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 ]

IMPORTANTE La función "array.includes (...)" no es compatible con IE, Chrome antes de la versión 47, Firefox antes de la versión 43, Safari antes de la versión 9 y Edge antes de la versión 14, por lo que aquí está el polyfill de Mozilla

¿Cómo eliminar varios elementos (JavaScript experimental de última generación 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 ]

Pruébalo tú mismo en BabelJS :)

Referencia


669
2017-12-19 19:54



Depende de si desea mantener un lugar vacío o no.

Si quieres un espacio vacío, eliminar está bien:

delete array[ index ];

Si no lo hace, debe usar el empalme método:

array.splice( index, 1 );

Y si necesita el valor de ese elemento, puede simplemente almacenar el elemento del conjunto devuelto:

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

En caso de que quiera hacerlo en algún orden, puede usar array.pop() para el último o array.shift() para el primero (y ambos devuelven el valor del artículo también).

Y si no conoce el índice del artículo, puede usar array.indexOf( item ) para obtenerlo (en un if() para obtener un artículo o en un while() para obtener todos ellos). array.indexOf( item ) devuelve el índice o -1 si no se encuentra.


357
2018-04-23 22:32



Un amigo estaba teniendo problemas en Internet Explorer 8y me mostró lo que hizo. Le dije que estaba mal, y él me dijo que obtuvo la respuesta aquí. La respuesta superior actual no funcionará en todos los navegadores (Internet Explorer 8, por ejemplo), y solo eliminará la primera aparición del elemento.

Eliminar TODAS las instancias de una matriz

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

Se desplaza por la matriz hacia atrás (ya que los índices y la longitud cambiarán a medida que se eliminan los elementos) y elimina el elemento si se encuentra. Funciona en todos los navegadores.


227
2017-08-10 19:21



Hay dos enfoques principales:

  1. empalme(): anArray.splice(index, 1);

  2. borrar: delete anArray[index];

Tenga cuidado cuando usa delete para una matriz. Es bueno para eliminar atributos de objetos pero no tan bueno para matrices. Es mejor usar splice para matrices.

Tenga en cuenta que cuando usa delete para una matriz que podría obtener resultados incorrectos para anArray.length. En otras palabras, delete eliminaría el elemento pero no actualizaría el valor de la propiedad de longitud.

También puede esperar tener agujeros en los números de índice después de usar eliminar, p. podrías terminar teniendo índices 1,3,4,8,9,11 y longitud como antes de usar eliminar. En ese caso, todos indexados for los bucles se bloquean, ya que los índices ya no son secuenciales.

Si está obligado a usar delete por alguna razón, entonces deberías usar for each bucles cuando necesitas recorrer las matrices. Como cuestión de hecho, siempre evite el uso de bucles indexados, si es posible. De esta forma, el código sería más robusto y menos propenso a problemas con los índices.


131
2017-12-21 11: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);

Array.prototype.remByVal = function(val) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === val) {
            this.splice(i, 1);
            i--;
        }
    }
    return this;
}

var rooms = ['hello', 'something']

rooms = rooms.remByVal('hello')

console.log(rooms)


103
2018-04-23 22:20