从数组中删除Falsy值

时间:2017-12-16 01:56:18

标签: javascript arrays filter boolean

所以我正在进行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 ]

知道发生了什么事吗???谢谢!

3 个答案:

答案 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 ...

  1. "所有虚假的价值观"也包括0。

  2. 您可以使用Boolean作为函数,进一步缩短过滤器表达式:

  3. 
    
    <!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;
    &#13;
    &#13;

答案 2 :(得分:0)

问题是,当值不同于空白

时,您的return语句将始终返回true
function truthy(value) {
    return value !==  '' ||false || null || undefined || NaN ;
}

应该是这样的

function truthy(value) {
    falseValues = ['',false,null,undefined,NaN];
    return !falseValues.contains(value);
}