我正在尝试编写一个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。因此,例如,如果i
在2
开始,则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]));
是的,问题的一部分实际上是拼接函数改变了数组。
让我补充一些方面。 case NaN
永远不会像你期望的那样工作,因为NaN != NaN
。因此,要判断某个值是否为NaN使用isNaN(var)
。
消化:你想要实现的目标的一个简单捷径就是const bouncer = (arr) => arr.filter(Boolean);
。这将有效地删除错误值,包括NaN值。您可以通过调用js控制台逐个测试值,例如:Boolean("")
,Boolean(0)
等。