所以我正在进行FreeCodeCamp挑战"从数组中删除所有虚假值。"
我创建了一个函数,但由于某种原因,它不会过滤掉所有虚假值:
function bouncer(arr) {
function truthy(value) {
return value !== '' ||false || null || undefined || NaN ;
}
var filtered = arr.filter(truthy);
return filtered;
}
bouncer([7, "ate", "", false, 9]);
这应该返回
[7, "ate", 9],
但是返回
[ 7, 'ate', false, 9 ]
如果我切换函数truthy的顺序,返回的值会改变。例如,移动'',
function truthy(value) {
return value !== '' ||false || null || undefined || NaN ;
- - - - >
return false || null || undefined || NaN || " ;
新
false || null || undefined || NaN || " ; 返回
[ 7, 'ate', '', 9 ]
知道发生了什么事吗???谢谢!
答案 0 :(得分:5)
return value !== '' ||false || null || undefined || NaN ;
这不符合你的想法。它实际上相当于
(((((value !== '') || false) || null) || undefined) || NaN)
value !== ''
时,与大多数情况一样,此表达式为真。你真的需要检查
value !== '' && value !== false && value !== null && value !== undefined && value !== NaN
但是因为这些都是假的,Array.filter
只关心真实性和虚假性,你可以用
truthy
函数
function truthy(value) {
return value;
}
甚至不值得突破三行:
var filtered = arr.filter(e => e);
答案 1 :(得分:1)
除了AuxTaco's answer ...
"所有虚假的价值观"也包括0。
您可以使用Boolean
作为函数,进一步缩短过滤器表达式:
<!DOCTYPE html>
<html>
<body>
<p>Hover over the checkbox to simulate a mouse-click.</p>
<button id="myCheck" onmouseover="myFunction()" onclick="alert('click event occured')">Foo</button>
<script>
function myFunction() {
document.getElementById("myCheck").click();
}
</script>
</body>
</html>
&#13;
答案 2 :(得分:0)
问题是,当值不同于空白
时,您的return语句将始终返回truefunction truthy(value) {
return value !== '' ||false || null || undefined || NaN ;
}
应该是这样的
function truthy(value) {
falseValues = ['',false,null,undefined,NaN];
return !falseValues.contains(value);
}