删除for循环中的对象

时间:2014-08-28 16:27:53

标签: javascript

当您使用forEach迭代javascript数组时,可以修改对象(下例中的obj),它将改变数组中的原始对象。

但如果删除它,为什么不将它从数组中删除?以下代码根本不会修改数组。

var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
myArr.forEach(function(obj) {
   delete obj;
});
console.log("after", myArr);

4 个答案:

答案 0 :(得分:4)

delete删除属性,它不会破坏与属性关联的值。

delete obj只是尝试(并且失败)从当前激活记录中删除本地变量obj

失败是因为激活记录虽然是一个对象,却无法以这种方式删除属性。

判断delete失败的一种方法是查看其返回值,这是一个布尔值,其中true表示在delete完成后没有这样的属性/绑定:

if (delete obj) {
  alert('the obj property was deleted');
} else {
  alert('delete did nothing');
}

将它放在(function () { var obj; ... })()内,它会告诉你它什么也没做。

将它放在with ({ obj: null }) { ... }内,它会告诉你它有效。

在严格模式下,任何返回false的delete都应该引发异常,而delete无效的{{1}}会导致分析时错误。

答案 1 :(得分:2)

您不能以这种方式使用deletedelete用于从对象中删除属性。

您可以使用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 :(得分:0)

删除会删除属性,对于数组,属性是其值。它适用于这种情况。 Array是一种特殊类型的对象,它还有一个名为length的属性。除非使用splice或任何修改值的数组特定方法,否则Array.length不会更新。

更新:您可以使用以下内容删除值,但数组长度将保持不变

var myArr = [{test: 1},{test2: 2}];
console.log("before", myArr);
myArr.forEach(function(obj) {
   delete myArr[myArr.indexOf(obj)];
});

console.log("after", myArr);

交替:

var myArr = [{a:1},{a:2},{a:1}];
for(var i=0;i<myArr.length;i++){
  delete myArr[i];
}

console.log(myArr[1]); //undefined

答案 3 :(得分:0)

@Andy是的,你想使用splice而不是delete,但是一个小修剪版本就是这样:

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