0

这不是从数组中删除负整数。我想不通为什么不...

for(var ii = 0; ii < diffs.length; ii++) {
     if(Number(diffs[ii]) < 0) {
       diffs.splice(ii, 1);
     }
   }
4

4 回答 4

2

在遍历期间修改数组时,不能从 0 向上遍历数组,因为删除当前元素会将数组中的其他元素向下移动并导致您跳过下一个元素。

解决此问题的常用方法是以相反的顺序遍历数组元素,因为通过删除当前元素重新定位的元素是您已经遍历的元素,而不是for循环接下来仍要处理的元素:

for(var ii = diffs.length - 1; ii >= 0; ii--) {
    if(Number(diffs[ii]) < 0) {
        removed.push(diffs[ii]);
        diffs.splice(ii, 1);
    }
}

您还必须在从阵列中删除之前推送已删除的项目。

于 2012-08-05T00:14:30.667 回答
2

您有两个问题:1)当您删除数组中的项目时,您必须确保不增加计数器(这可以通过从末尾计数来避免)。2)您必须存储 splice 的结果,然后将其添加到删除的数组中

for(var ii = diffs.length - 1; ii >= 0; ii--) {
    if(+diffs[ii] < 0) { // use the unary plus operator to convert to a number, just in case
        removed.push(diffs.splice(ii, 1)[0]); //splice returns an array - get the first and only element in it
    }
}
于 2012-08-05T00:17:20.990 回答
0

索引也可以这样固定:

for (ii = 0; ii < diffs.length; ii++) {
    if (Number(diffs[ii]) < 0) {
        removed.push(diffs[ii]);
        diffs.splice(ii, 1);
        ii--;
    }
}
console.log(diffs);
console.log(removed);

小提琴

正如我现在所看到的,再次发布这个答案太晚了:)

于 2012-08-05T00:29:55.743 回答
0

在向前遍历数组时删除项目时,您需要调整循环变量或跳过下一个元素。另一种可能性是向后遍历。

for (var i=0; i<diffs.length; i++)
    if (Number(diffs[i]) < 0)
        diffs.splice(i--, 1);

// OR

for (var i=diffs.length-1; i>=0; i--)
    if (Number(diffs[i]) < 0)
        diffs.splice(i, 1);

diffs创建一个新数组并用它覆盖变量可能更容易(甚至更快) 。这与filter()方法非常优雅:

var diffs = diffs.filter(function(diff) { return Number(diff) >= 0; });
于 2012-08-05T00:24:59.787 回答