【问题标题】:Removing negatives from JavaScript array从 JavaScript 数组中删除负数
【发布时间】:2012-08-02 12:26:57
【问题描述】:

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

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

【问题讨论】:

  • 这些数字是字符串格式的吗?尝试将它们转换为Number:Number(diffs[ii]) &lt; 0
  • 这些“否定”是如何声明的?你确定它们是数字而不是字符串吗?

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


【解决方案1】:

在遍历过程中修改数组时,不能从 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)您必须存储 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
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        索引也可以这样固定:

        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

        正如我现在所看到的,再次发布此答案为时已晚:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 2015-01-28
          相关资源
          最近更新 更多