为什么switch在Javascript数组的for循环中只运行一次?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么switch在Javascript数组的for循环中只运行一次?相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个javascript代码,删除给定数组中的所有错误值。代码适用于第一个负值是查找并且不适用于后续的错误值,就好像一旦交换机运行,整个for循环被破坏。

我的代码如下。

  function bouncer(arr) {
  for(var i=0;i<arr.length; i++){

    switch(arr[i]){
      case false:
      case null:
      case 0:
      case "":
      case undefined:
      case NaN: arr.splice(i,1); break;
    }
  }

  return arr;
}

bouncer([7, "ate",  false,"", 9]);

这是正常的开关行为吗?

答案

splice改变了数组,当你在数组上进行迭代时,这不是一件好事;如果i的项目被检测为falsey并且spliced out,那么一旦for循环迭代结束,i将增加1。因此,例如,如果i2开始,则2处的项目被删除,那么3处的项目现在为2.但是从未检查2处的新项目,因为i已增加到3。

而是使用.filter来评估数组中的每个项目,并且没有索引问题,也不需要手动迭代:

const bouncer = (arr) => arr.filter((item) => {
  switch (item) {
    case false:
    case null:
    case 0:
    case "":
    case undefined:
    case NaN:
      return false;
  }
  return true;
});

console.log(bouncer([7, "ate", false, "", 9]));
另一答案

是的,问题的一部分实际上是拼接函数改变了数组。

让我补充一些方面。 case NaN永远不会像你期望的那样工作,因为NaN != NaN。因此,要判断某个值是否为NaN使用isNaN(var)

消化:你想要实现的目标的一个简单捷径就是const bouncer = (arr) => arr.filter(Boolean);。这将有效地删除错误值,包括NaN值。您可以通过调用js控制台逐个测试值,例如:Boolean("")Boolean(0)等。

以上是关于为什么switch在Javascript数组的for循环中只运行一次?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript

Javascript.03 -- 数组简单的逻辑自定义函数

javascript常用数组算法总结

JavaScript 第3天学习规划丨循环-for数组

JavaScript 需要了解的高级的知识点

javascript 数组排序(三种方法)