Eliminar elementos de matriz en JavaScript: eliminar frente a empalme

Resuelto lYriCAlsSH asked hace 15 años • 29 respuestas

¿ Cuál es la diferencia entre usar el deleteoperador en el elemento de la matriz y usar el Array.splicemétodo ?

Por ejemplo:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

¿Por qué tener el método de empalme si puedo eliminar elementos de una matriz como puedo hacerlo con los objetos?

lYriCAlsSH avatar Feb 01 '09 18:02 lYriCAlsSH
Aceptado

deleteeliminará la propiedad del objeto, pero no reindexará la matriz ni actualizará su longitud. Esto hace que parezca como si no estuviera definido:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

Tenga en cuenta que, de hecho, no está establecido en el valor undefined, sino que la propiedad se elimina de la matriz, lo que hace que parezca indefinida. Las herramientas de desarrollo de Chrome aclaran esta distinción al imprimir emptyal registrar la matriz.

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

myArray.splice(start, deleteCount)en realidad elimina el elemento, reindexa la matriz y cambia su longitud.

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]
Andy Hume avatar Feb 01 '2009 11:02 Andy Hume

Método Array.remove()

John Resig , creador de jQuery, creó un Array.removemétodo muy útil que siempre uso en mis proyectos.

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

y aquí hay algunos ejemplos de cómo podría usarse:

// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);

sitio web de juan

Mohsen avatar Mar 22 '2012 00:03 Mohsen

Debido a que eliminar solo elimina el objeto del elemento en la matriz, la longitud de la matriz no cambiará. Splice elimina el objeto y acorta la matriz.

El siguiente código mostrará "a", "b", "indefinido", "d"

myArray = ['a', 'b', 'c', 'd']; delete myArray[2];

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

Mientras que esto mostrará "a", "b", "d"

myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}
andynormancx avatar Feb 01 '2009 11:02 andynormancx

Me topé con esta pregunta mientras intentaba entender cómo eliminar cada aparición de un elemento de una matriz. Aquí hay una comparación de splicey deletepara eliminar cada elemento 'c'del itemsArray.

var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  items.splice(items.indexOf('c'), 1);
}

console.log(items); // ["a", "b", "d", "a", "b", "d"]

items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  delete items[items.indexOf('c')];
}

console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]
Troy Harvey avatar May 09 '2012 13:05 Troy Harvey