我尝试遍历数组并删除任何等于false,null,0,undefined,NaN或""
的值。当我调用该函数时,它应该返回一个空白数组,但现在它输出[null,0,null,null,""]
。这是我到目前为止所拥有的。
function bouncer(arr) {
for(i=0;i<arr.length;i++){
if(arr[i]===false||null||0||undefined||NaN||""){
arr.splice(i,1);
}
}
return arr;
}
bouncer([false, null, 0, NaN, undefined, ""]);
任何人都可以告诉我我做错了什么以及它为什么不从数组中删除这些值?
答案 0 :(得分:2)
问题在于这一行:
if(arr[i]===false||null||0||undefined||NaN||""){...}
比较多个值的正确方法是:
if(arr[i]===false|| arr[i]=== null|| arr[i]=== 0||arr[i] === undefined|| arr[i] === NaN|| arr[i]=== ""){ ..}
您可以进一步简化它,因为我们需要过滤的所有值自然地评估为false
if(!arr[i])
使用为拼接调整的索引重新实现函数:
function bouncer(arr){
for( var i = 0 ; i < arr.length ; i++ ){
if(!arr[i]){
arr.splice(i--,1);
}
}
return arr;
}
使用Array.filter
function bouncer(arr){
return arr.filter((item) => (!!item));
}
答案 1 :(得分:0)
错误:
if(arr[i]===false||arr[i]===null||arr[i]===0||arr[i]===undefined||arr[i]===NaN||arr[i]==="")
NaN !== NaN
起,应使用isNaN(arr[i])
if (...) {
arr.splice(i,1);
i--; // should minus one here!
}
答案 2 :(得分:0)
您可能希望再次阅读javascript语言语法说明。
if (arr[i] === false) ...
表示,如果arr [i]为false,或者null为true或0为true或undefined为true或NaN为true或“”为true。第一部分取决于arr [i]是什么,但其余部分都是假的。这意味着我们可以将您的陈述简化为:
if (arr[i] == false) ...
因为所有其余的都是假的。但是推断你想要做什么,你可能想说
i
将执行更宽松,更不严格的比较(即,它不会检查被比较的元素的类型),并将测试我推断你想要的东西。
但是,您的逻辑还有另一个问题:当您在迭代数组时删除元素,function bouncer(arr) {
var r=[];
for(i=0;i<arr.length;i++){
if ( arr[i] )
r.push(arr[i]);
}
return r;
}
正在推进,因为您正在从中移除元素。另一种方法可能是建立返回的数组(而不是修改输入数组)。
arr = arr.filter(function (elem) { return elem; });
或者更好的是,使用专为确定要保留的元素而设计的方法(尽管它不会修改原始数组,因此您必须重新分配它:
walker.h