从JavaScript数组中删除底片

时间:2012-08-05 00:09:48

标签: javascript arrays for-loop splice negative-number

这不是从数组中删除负整数。我无法弄清楚为什么不......

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

4 个答案:

答案 0 :(得分: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);
    }
}

在将删除的项目从阵列中移除之前,您还必须将其移除。

答案 1 :(得分: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
    }
}

答案 2 :(得分: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() method

非常优雅
var diffs = diffs.filter(function(diff) { return Number(diff) >= 0; });

答案 3 :(得分: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);

fiddle

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