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);
0
Doug Molineux 28 ago. 2014 a las 20:27

4 respuestas

La mejor respuesta

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.

4
Mike Samuel 28 ago. 2014 a las 16:40

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
0
Abhi 28 ago. 2014 a las 17:00

@ 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);
0
Charles Harris 28 ago. 2014 a las 17:03

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);

Demo

2
Andy 28 ago. 2014 a las 16:34