Array.prototype.filter自动过滤掉falsey值

时间:2015-08-05 19:53:11

标签: javascript arrays filter functional-programming

过滤器功能是否会自动过滤掉false,null或undefined等虚假值?如果是这样,如何阻止它这样做。

我需要过滤掉数组中的所有0,所以我使用了array.filter回调,并且我意识到过滤器函数会删除falsey值,即使我想保留它们。有办法解决这个问题吗?

编辑:这是我的代码,进行深度比较并没有返回falsey值。

function removeZero(arr) {
  return arr.filter(function(element){
    if(element!==0){
      return element;
    }
  });
}

编辑2:这里是包含测试数组内容的repl.it链接,当我运行它时,结果会过滤掉false,null和undefined。 https://repl.it/BAiK

3 个答案:

答案 0 :(得分:5)

使用!==运算符

[1,2,3,0,[],{},false,undefined].filter(function(e){return e !== 0})
// Output: [1, 2, 3, Array[0], Object, false, undefined]

!=运算符(您不想使用)的输出进行比较

[1,2,3,0,[],{},false,undefined].filter(function(e){return e != 0})
// Output: [1, 2, 3, Object, undefined]

这是您提供的代码https://repl.it/BAiK

var removeZeros = function (arr) {
  return arr.filter(function(element){
    if(element!==0){
      return element; // here is the error, you need to return a boolean. (true to add element to final array, false to ignore element)
    }
  });
}

console.log(removeZeros([false, 1, 2, 3, null, 0, 4, undefined, 5, 0]));
// Output: [ 1, 2, 3, 4, 5 ]

你知道,filter函数的返回值需要是一个布尔值,而不是你想要返回的元素。当您返回false时,该元素不会添加到最终数组中,当您返回true时,将返回正在处理的元素。修改代码,查看我的编辑

这是你的代码修复

var removeZeros = function (arr) {
  return arr.filter(function(element){
    return element !== 0 // this returns a boolean
  });
}

console.log(removeZeros([false, 1, 2, 3, null, 0, 4, undefined, 5, 0]));
// Output: [ false, 1, 2, 3, null, 4, undefined, 5 ]

答案 1 :(得分:1)



max_element

var result = [1, 2, 3, 0, false, undefined, null, -1].filter(
    function (e) { 
        return e !== 0;
    });
document.getElementById('out').innerHTML = result.reduce(function (r, a) { return r + '\n    ' + a + ' [' + (typeof a) + ']'; }, '[') + '\n]';




您的示例不会返回true,而是返回值itselft,它将被评估。如果返回值是真实的,则<pre id="out"></pre>包含元素。

Array.filter()

答案 2 :(得分:1)

正义

[1,2,3,0,[],{},false,undefined].filter(Boolean)  // return [1, 2, 3, [], {}]

这里Boolean是一个函数,当所有falsy value进入时,它将返回false