【问题标题】:Array.prototype.filter automatically filtering out falsey valueArray.prototype.filter 自动过滤掉假值
【发布时间】:2015-08-05 19:53:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的代码在这里可能会有所帮助。过滤器功能将删除您要求它删除的内容。如果它正在删除 nullundefined,那是因为 这就是你要求它做的事情
  • 如果某个答案解决了您的问题,请单击答案左侧的绿色对勾接受它。这样,下一个访问此问题的人会更好地知道什么是可以解决您的问题的答案。
  • 我更改了示例以显示对象也发生了什么。你能告诉我们数组的内容吗?
  • 我编辑了我的答案并修复了你的代码

标签: javascript arrays filter functional-programming


【解决方案1】:

使用!== 运算符

[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 ]

你看,过滤器函数的返回值需要是一个布尔值,而不是你想要返回的元素。返回 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 ]

【讨论】:

  • 请注意,!= 唯一不同的条目是布尔值 false。并不是说你应该只使用!==
  • 我认为过滤器功能无论如何都会过滤掉虚假值。至少当我使用深度比较时,它仍然过滤掉了虚假值。我一直在寻找一种方法来覆盖或绕过它。
  • @jperelli 请查看编辑。感谢您的帮助。
  • 你看,过滤函数的返回值需要是布尔值,而不是你要返回的元素。返回 false 时,不将元素添加到最终数组中,返回 true 时,返回正在处理的元素。查看我的修改并修复了您的代码
【解决方案2】:

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]';
<pre id="out"></pre>

您的示例不返回 true,而是返回值本身,它被评估。 Array.filter()如果返回值为真,则包含该元素。

function removeZero(arr) {
    return arr.filter(function(element) {
        if (element !== 0){
            return element; // <-- falsy values are not true.
        }
    });
}

【讨论】:

  • 有没有办法将 JSON 字符串转换回数组,因为我仍然希望返回数组。
  • 只取结果。它是一个数组。
【解决方案3】:

只是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多