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

问题描述 投票:0回答:2

我正在尝试编写一个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]);

这是正常的开关行为吗?

javascript arrays switch-statement
2个回答
5
投票

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

或者,当然,你可以检查每个项目是否是假的:

const bouncer = (arr) => arr.filter(Boolean);

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

1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.