2012-08-05 57 views
0

这不会从数组中移除负数。我想不通,为什么不......从JavaScript数组中删除底片

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

这些数字是字符串格式吗?尝试将它们转换为'Number':'Number(diffs [ii])<0' – rcdmk 2012-08-05 00:11:16

+1

这些“底片”是如何声明的?你确定他们是数字而不是字符串? – Joseph 2012-08-05 00:11:24

回答

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

您还必须在将其从阵列中移除之前推动已移除的项目。

2

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

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

正如现在我明白了,也又迟到张贴了这个答案:)