代码之家  ›  专栏  ›  技术社区  ›  Rahul Purohit

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

  •  0
  • Rahul Purohit  · 技术社区  · 6 年前

    我正在尝试编写一个Javascript代码,从给定数组中删除所有假值。该代码适用于第一个负值is finds,而不适用于后续的假值,就好像一旦开关运行,整个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]);
    

    2 回复  |  直到 6 年前
        1
  •  5
  •   CertainPerformance    6 年前

    splice 变异 数组,这不是一件好事 当你在数组上迭代的时候 ;如果项目位于 i spliced 出去,一旦 for 循环迭代结束, 将增加1。例如,如果 开始于 2 3点现在是2点。但是 新的 2处的项目从未被选中,因为 已增加到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
  •  1
  •   danielmeneses    6 年前

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

    让我再补充一些方面。这个 case NaN 不会像你期望的那样工作,因为 NaN != NaN isNaN(var) .

    一个简单的捷径就是 const bouncer = (arr) => arr.filter(Boolean); 您可以通过调用js控制台逐个测试这些值,例如: Boolean("") , Boolean(0) 等等。