2016-12-27 74 views
4

我有一个任务可以从给定数组中删除false,null,0,“”,undefined和NaN元素。我工作的解决方案,除了空删除所有。任何人都可以解释原因下面的代码:从javascript中的数组中过滤null

function bouncer(arr) { 
var notAllowed = ["",false,null,0,undefined,NaN]; 
    for (i = 0; i < arr.length; i++){ 
     for (j=0; j<notAllowed.length;j++) { 
     arr = arr.filter(function(val) { 
       return val !== notAllowed[j]; 
       }); 
    } 
} 
return arr; 
} 

bouncer([1,"", null, NaN, 2, undefined,4,5,6]); 
+0

你应该知道'.filter() '不会从阵列中删除任何东西。它创建一个删除了项目的新阵列。 – 2016-12-27 14:34:56

+0

[如何在数组(JS)中过滤()out NaN,null,0,false](https://stackoverflow.com/questions/31925323/how-to-filter-out-nan-null- 0-false-in-an-array-js) – Kowser

回答

10

好,因为所有你的价值观是falsy,只是做一个!!(转换为布尔值)检查:

[1,"", null, NaN, 2, undefined,4,5,6].filter(x => !!x); //returns [1, 2, 4, 5, 6] 

编辑:显然不需要投:

[1,"", null, NaN, 2, undefined,4,5,6].filter(x => x); 

而上面的代码删除null就好了,它的NaN这就是问题所在。 Nina在她的回答中说,NaN !== NaN

+0

而且你不需要'!!'。只要'x => x'就足够了,尽管@PranavCBalan的方式不需要创建一个函数。 '.filter(布尔)' – 2016-12-27 14:29:33

+0

是的,你的解决方案工作。感谢那,但是..我刚刚开始学习js所以是的..它会帮助我理解为什么我的代码不起作用。 – gshaineala

+0

@squint - Ahh不知道这件事情,假设我需要它。也不知道关于甜'布尔'而不是函数创建...总是学习,将进行编辑。 – tymeJV

0

使用

function bouncer(arr) { 
 
return arr.filter(function(item){ 
 
    return !!item; 
 
}); 
 
} 
 

 
console.log(bouncer([1,"", null, NaN, 2, undefined,4,5,6]));

7

它与NaN一个问题,因为

NaN !== NaN 

在这里阅读更多:Testing against NaN

要筛选这些值,您可以检查是否存在瑕疵。

function bouncer(arr) { 
 
    return arr.filter(Boolean); 
 
} 
 

 
console.log(bouncer([1, "", null, NaN, 2, undefined, 4, 5, 6]));

+0

感谢您的信息。在我学习的平台上不会过滤null ...但在调试器中它会过滤NaN。 – gshaineala

1

可以使用Array.prototype.filtertruthy值检查 - 见下面的演示:

function bouncer(array) { 
 
    return array.filter(function(e) { 
 
    return e; 
 
    }); 
 
} 
 

 
console.log(bouncer([1,"", null, NaN, 2, undefined,4,5,6]));