你如何用.splice删除虚假值?

时间:2017-06-18 00:04:34

标签: javascript arrays

我正在尝试从数组中删除所有有价值的值(false,null,0,“”,undefined,NaN)。我的研究表明.filter()是实现这一目标的正确方法,但我已经尝试用下面的代码来解决我的问题,我不明白为什么.splice似乎只是在我想要的时候删除“”同时删除false。

目标是返回[7,“吃”,9]但是当我得到的是[7,“吃”,假,9]

function bouncer(arr) {
  for (i=0; i<arr.length; i++){
    if (Boolean(arr[i]) === false){
      arr.splice(i,1);
    }
  }
  return arr;
}
bouncer([7, "ate", "", false, 9]);

3 个答案:

答案 0 :(得分:1)

此处的问题是.splice()调用正在更改数组的length,因此在删除""后的下一次迭代中,i将指向最后一个元素并跳过false索引。

如果您查看splice() MDN Reference,您会看到:

  

描述

     

如果指定要插入的元素数不同于   您要删除的数字,数组的长度不同   电话结束。

<强>演示:

这是一个记录迭代元素的演示,并显示已跳过false值:

&#13;
&#13;
function bouncer(arr) {
  for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);
    if (Boolean(arr[i]) === false) {
      arr.splice(i, 1);
    }
  }
  return arr;
}
bouncer([7, "ate", "", false, 9]);
&#13;
&#13;
&#13;

<强>解决方案:

作为一种解决方案,您可以像这样使用反向for循环或do..while循环:

&#13;
&#13;
function bouncer(arr) {
  var i = arr.length;
  do {
    if (Boolean(arr[i]) === false) {
      arr.splice(i, 1);
    }
    i--;
  } while (i > 0);
  return arr;
}
console.log(bouncer([7, "ate", "", false, 9]));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

因为Array.splice正在修改数组的长度,所以i递增,但删除后的下一个项目实际上是在同一个i数值索引,所以它最终会跳过一个进入当前指数的人。

您可以尝试在删除项目时通过递增i来协调它,或者您可以反向移动,因为上一个索引将始终保持为i--

function bouncer(arr) {
  for (var i = arr.length - 1; i >= 0; i--){
    if (Boolean(arr[i]) === false){
      arr.splice(i,1);
    }
  }
  return arr;
}
console.log(bouncer([7, "ate", "", false, 9]));

答案 2 :(得分:0)

您可以尝试这样的事情:

&#13;
&#13;
function bouncer(arr) {
  var resultArr = [];
  var k = 0;
  for (i=0; i<arr.length; i++){
    if (!(arr[i] === false)){
     resultArr[k] = arr[i];
     k++;
    }
  }
  return resultArr;
}


var b = bouncer([7, "ate", "", false, 9]);
console.log(b);
&#13;
&#13;
&#13;