811 votos

Borrando elementos de un array en JavaScript - delete vs splice

¿Cuál es la diferencia entre usar el operador delete en el elemento de un array en lugar de usar el método Array.splice?

Por ejemplo:

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

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

¿Por qué incluso tener el método splice si puedo eliminar elementos de arrays como puedo con objetos?

1102voto

Andy Hume Puntos 15186

delete eliminará la propiedad del objeto, pero no reindexará el array ni actualizará su longitud. Esto hace que aparezca como si fuera indefinido:

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

Hay que tener en cuenta que en realidad no se establece en el valor undefined, sino que la propiedad se elimina del array, haciéndolo parecer indefinido. Las herramientas de desarrollador de Chrome hacen esta distinción clara al imprimir empty al registrar el array.

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

myArray.splice(inicio, cantidadAEliminar) en realidad elimina el elemento, reindexa el array y cambia su longitud.

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]

267voto

Mohsen Puntos 16856

Método Array.remove()

John Resig, creador de jQuery, creó un útil método Array.remove que siempre utilizo en mis proyectos.

// Array Remove - Por John Resig (Licenciado por MIT)
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í algunos ejemplos de cómo podría ser utilizado:

// Eliminar el segundo elemento del array
array.remove(1);
// Eliminar el penúltimo elemento del array
array.remove(-2);
// Eliminar el segundo y tercer elemento del array
array.remove(1,2);
// Eliminar el último y penúltimo elemento del array
array.remove(-2,-1);

Sitio web de John

78voto

andynormancx Puntos 6026

Como la función delete solo elimina el objeto del elemento en el arreglo, la longitud del arreglo no cambiará. Splice elimina el objeto y acorta el arreglo.

El siguiente código mostrará "a", "b", "undefined", "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]);
}

35voto

Troy Harvey Puntos 613

Me encontré con esta pregunta mientras trataba de entender cómo eliminar cada ocurrencia de un elemento de un Array. Aquí hay una comparación de splice y delete para eliminar cada 'c' del Array items.

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"]
​

11voto

f3lix Puntos 13634

Desde Core JavaScript 1.5 Reference > Operators > Special Operators > delete Operator :

Cuando se elimina un elemento de un array, la longitud del array no se ve afectada. Por ejemplo, si elimina a[3], a[4] sigue siendo a[4] y a[3] es undefined. Esto se mantiene incluso si se elimina el último elemento del array (eliminar a[a.length-1]).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X