Cuando está iterando sobre una matriz de JavaScript usando forEach, el objeto (obj en el ejemplo a continuación) se puede modificar y alterará el objeto original en la matriz.
Pero si lo elimina, ¿por qué no lo elimina de la matriz? El siguiente código no parece modificar la matriz en absoluto.
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
myArr.forEach(function(obj) {
delete obj;
});
console.log("after", myArr);
4 respuestas
delete
elimina las propiedades, no destruye el valor asociado con una propiedad.
delete obj
solo intenta (y falla) eliminar la variable local obj
del registro de activación actual.
Falla porque un registro de activación, aunque es un objeto, no puede eliminar propiedades de esta manera.
Una forma de saber cuándo falla un delete
es mirar su valor de retorno, que es un valor booleano donde verdadero indica que no existe tal propiedad / enlace después de que se complete el delete
:
if (delete obj) {
alert('the obj property was deleted');
} else {
alert('delete did nothing');
}
Pon eso dentro de (function () { var obj; ... })()
y te dirá que no hizo nada.
Pon eso dentro de with ({ obj: null }) { ... }
y te dirá que funcionó.
En modo estricto, cualquier delete
que devuelva falso debería generar una excepción, y delete
s que nunca pueden funcionar debería dar como resultado un error de tiempo de análisis.
Eliminar elimina la propiedad y para una matriz, la propiedad es su valor. Funciona en este caso. La matriz es un tipo especial de objeto que tiene una propiedad más llamada longitud. Array.length no se actualiza a menos que use empalme o cualquier método específico de matriz que modifique el valor.
ACTUALIZACIÓN: puede usar lo siguiente para eliminar el valor, pero la longitud de la matriz seguirá siendo la misma
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
myArr.forEach(function(obj) {
delete myArr[myArr.indexOf(obj)];
});
console.log("after", myArr);
ALTERNA:
var myArr = [{a:1},{a:2},{a:1}];
for(var i=0;i<myArr.length;i++){
delete myArr[i];
}
console.log(myArr[1]); //undefined
@ Andy tiene razón, desea utilizar splice
y no delete
, pero una versión de recortadora sería simplemente esto:
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
for (var i = myArr.length; i > 0; i--) {
myArr.splice(i--, myArr[i]);
}
console.log("after", myArr);
No puede usar delete
de esta manera. delete
es para eliminar propiedades de los objetos.
Puede hacer lo que quiera usando splice
.
var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
for (var i = 0, l = myArr.length; i < l; i++) {
myArr.splice(i, 1);
i--; l--;
}
console.log("after", myArr);
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.