Eliminar elementos de matriz en JavaScript: eliminar frente a empalme
¿ Cuál es la diferencia entre usar el delete
operador en el elemento de la matriz y usar el Array.splice
mé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?
delete
eliminará 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 empty
al 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"]
Método Array.remove()
John Resig , creador de jQuery, creó un Array.remove
mé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
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]);
}
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 splice
y delete
para eliminar cada elemento 'c'
del items
Array.
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"]