0

我有一个对象,包含 5 个元素。

现在我循环删除与我的条件匹配的元素。

for(var i = 0; i < items.length ; i++){
  console.log(i + '-'); //the result is 3-4
  if(_today.getTime() - items[i].timestamp >= numDay * ONE_DAY){
     console.log(i); //the result is 3
     items.splice(i,1);
  }
}

我的数组样本:

[{"DepartmentID":56,"CategoryID":117,"BrandID":19,"ID":707},
 {"DepartmentID":56,"CategoryID":117,"BrandID":19,"ID":708},
 {"DepartmentID":56,"CategoryID":117,"BrandID":19,"ID":709},
 {"DepartmentID":56,"CategoryID":117,"BrandID":19,"ID":710},
 {"DepartmentID":56,"CategoryID":117,"BrandID":19,"ID":711}]

只删除 this 中的一个元素for loop。是因为问题的索引吗?如何删除n与此循环中的条件匹配的元素?

任何帮助将不胜感激,谢谢..

4

4 回答 4

2

当您在循环时修改数组大小时,您需要随时调整当前索引。在您的情况下,每当您拼接需要的项目时--i;。这会将您的索引备份一个并且不会导致您的循环跳过一个项目。

于 2013-09-13T05:57:19.337 回答
0

我在其中一个 jQuery 插件的源代码中找到了这个解决方案。items.splice(i--, 1);看起来简单多了。这仅适用于从数组中一次删除一项的情况

for(var i = 0; i < items.length ; i++){
  if(_today.getTime() - items[i].timestamp >= numDay * ONE_DAY){
     items.splice(i--, 1);
  }
}
于 2013-09-13T06:17:23.643 回答
0

这是因为您使用 items.length 来决定循环的迭代并在循环内删除它,这会在您删除的每次迭代中改变长度。您可以在循环内操作数组的副本,然后将其替换为原始数组。

像这样的东西

var temp = items;

for(var i = 0; i < items.length ; i++){
  console.log(i + '-'); //the result is 3-4
  if(_today.getTime() - items[i].timestamp >= numDay * ONE_DAY){
     console.log(i); //the result is 3
     temp.splice(i,1);
  }
}

items= temp;
于 2013-09-13T06:01:37.697 回答
0

首先,找到要删除的元素的索引:

var array = [2, 5, 9];
var index = array.indexOf(5);

然后用拼接删除它:

if (index > -1) {
    array.splice(index, 1);
}

splice 的第二个参数是要移除的元素的数量。请注意, splice 会修改数组并返回一个包含您删除的元素的数组

于 2013-09-13T06:01:45.067 回答