【问题标题】:Why does switch run just once inside a for loop of an Javascript array?为什么 switch 在 Javascript 数组的 for 循环中只运行一次?
【发布时间】:2018-09-02 20:09:08
【问题描述】:

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


    【解决方案1】:

    splice 对数组进行变异在遍历数组时这样做并不是一件好事;如果i 处的项目被检测为错误并且spliced 出局,则一旦for 循环迭代结束,i 将加一。因此,例如,如果 i 开始于 2,则删除 2 处的项目,那么在 3 处 的项目现在位于 2。但是 new 从不检查 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]));

    【讨论】:

    • 感谢您提供如此出色的细节。会尽快接受答案。
    【解决方案2】:

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

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

    建议const bouncer = (arr) =&gt; arr.filter(Boolean); 是您想要实现的目标的简单快捷方式。这将有效地删除错误值,包括 NaN 值。 您可以通过在 js 控制台中调用例如:Boolean("")Boolean(0) 等来逐一测试这些值。

    【讨论】:

    • 谢谢。你对 Nan 的价值是正确的。你能告诉我应该在哪里学习过滤器和映射等高阶函数的工作原理吗?
    • 对于Array.prototype 中所有可用方法的规范,请转到here。如果您想了解一些 shims 实现,请查看 here,如果这回答了您的问题。
    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多