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

为什么开关在Javascript数组的for循环中只运行一次?,javascript,arrays,switch-statement,Javascript,Arrays,Switch Statement,我试图编写一个Javascript代码,从给定数组中删除所有假值。该代码适用于查找到的第一个负值,不适用于后续的假值,就好像一旦运行了开关,整个for循环就中断了一样 我的代码如下 function bouncer(arr) { for(var i=0;i<arr.length; i++){ switch(arr[i]){ case false: case null: case 0: case "": case

我试图编写一个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]);
功能弹跳器(arr){
对于(var i=0;i
splice
变异数组,当您在数组上迭代时,这不是一件好事;如果
i
处的项被检测为错误并且被
拼接
,一旦
for
循环迭代结束,
i
将增加1。例如,如果
i
 2
,2处的项目被删除,3处的项目现在为2。但2处的新项目从未被选中,因为
i
已增加到3

改为使用
.filter
,它会计算数组中的每个项,不会出现索引问题,也不需要手动迭代:

const bouncer=(arr)=>arr.filter((项)=>{
开关(项目){
案例错误:
大小写为空:
案例0:
案例“”:
未定义的情况:
案例南:
返回false;
}
返回true;
});
日志(bouncer([7,“ate”,false,“,9]))
splice
对数组进行变异,当您在数组上迭代时,这不是一件好事;如果
i
处的项被检测为错误并且被
拼接出来,一旦
for
循环迭代结束,
i
将增加1。例如,如果
i
开始2
,2处的项目被删除,3处的项目现在为2。但2处的新项目从未被选中,因为
i
已增加到3

改为使用
.filter
,它会计算数组中的每个项,不会出现索引问题,也不需要手动迭代:

const bouncer=(arr)=>arr.filter((项)=>{
开关(项目){
案例错误:
大小写为空:
案例0:
案例“”:
未定义的情况:
案例南:
返回false;
}
返回true;
});

log(bouncer([7,“ate”,false,“,9]);
是的,第o部分问题实际上是拼接函数改变了数组

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

Sugestion:一个简单的快捷方式是
const bouncer=(arr)=>arr.filter(Boolean);
。这将有效地删除假值,包括NaN值。
您可以通过在js控制台中调用来逐个测试这些值,例如:
Boolean(“”
Boolean(0)
,等等。

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

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

Sugestion:一个简单的快捷方式是
const bouncer=(arr)=>arr.filter(Boolean);
。这将有效地删除假值,包括NaN值。
您可以通过在js控制台中调用来逐个测试这些值,例如:
Boolean(“”
Boolean(0)
等等。

谢谢你提供了这么好的详细信息。我会尽快接受答案。谢谢你提供了这么好的详细信息。我会尽快接受答案。谢谢。关于Nan值,你是对的。你能告诉我应该在哪里学习像filter和map这样的高阶函数的工作吗?对于所有可用方法的规范,请在
数组中使用ent。prototype
go。如果您想了解一些垫片实现,请看一下,这是否回答了您的问题。谢谢。关于Nan值,您是对的。您能告诉我应该从哪里学习高阶函数(如filter和map)的工作原理吗?对于
Array.prototype
go。如果你想看一看一些垫片的实现,看看这是否回答了你的问题。