1

我有以下代码:

  $.each(current, function(index, value) {
     thisArray = JSON.parse(value);
     if (thisArray.ttl + thisArray.now > now()) {
        banned.push(thisArray.foodID);
     }
     else{
        current.splice(index,1);
     }
  });

以下行有问题:

current.splice(index,1);

发生的事情是它(可能)取消设置符合else条件的第一个案例,然后当它必须再次发生时,键不再匹配并且它不能取消设置任何其他内容。它工作一次,但在以下迭代中不工作。

有解决办法吗?

4

3 回答 3

2

您可以使用常规for循环,并向后循环:

for(var i=current.length-1; i>= 0; i--) {
   var thisArray = JSON.parse(current[i]);
   if (thisArray.ttl + thisArray.now > now()) {
      banned.push(thisArray.foodID);
   } else {
      current.splice(i, 1);
   }
});

而且它似乎thisArray实际上是一个对象,而不是一个数组......

于 2013-08-17T20:17:15.597 回答
0

您可以使用常规 for 循环,但在拼接后,将索引减少 1

for(var i=0; i<current.length; i++){
    current.splice(i, 1); i--;
    }
于 2013-08-17T20:25:17.413 回答
0

如果在遍历数组时(通过移动对象)对数组进行变异,则应注意,因为某些元素可能会像您的情况一样被跳过。

当您调用current.splice(index, 1)元素时,元素index将被删除,元素index+1将取而代之。但是 thenindex会增加,从而跳过一个元素。

更好的解决方案是 IMO 的读写方法。您将一个索引保留为“读取指针”并始终递增它,而另一个索引(“写入指针”)仅在您决定应将元素保留在数组中时才递增:

var wp = 0;  // The "write pointer"
for (var rp=0; rp<a.length; rp++) {
    if (... i want to keep element a[rp] ...) {
        a[wp++] = a[rp];
    }
}
a.splice(wp); // Remove all elements after wp

这是一个o(N)操作,最多将移动每个元素一次。其他方法,例如从头开始并使用相同的方法,将在每次需要删除splice(i, 1)元素后继续移动所有元素。i

于 2013-08-17T20:25:23.947 回答