【问题标题】:Filter not behaving as expected with 0 in an array. Javascript过滤器的行为与数组中的 0 不一样。 Javascript
【发布时间】:2019-03-04 22:36:12
【问题描述】:

我有一个这样的随机整数数组:[ 1, 2, 3, 4, 0 ],我需要根据wanted 条件返回一个奇数或偶数的新数组。

我尝试了以下过滤方法:

const result = array.filter(item => {
    const test = item % 2;
    if(wanted === 'odd' && test > 0) return item;
    if(wanted === 'even' && test === 0) return item;
  })

并期望这会起作用,但它只会在wanted 偶数时返回[2, 4] 而永远不会返回[0, 2, 4]

任何关于为什么会出现这种情况的想法将不胜感激。

【问题讨论】:

  • test 将始终为 10。当您真的只是在寻找 1 时,测试 > 0 会让人感到困惑。

标签: javascript arrays filter integer


【解决方案1】:

您需要从过滤器回调中返回布尔值,而不是项目。当您返回该项目时,它主要工作,但如果该项目为零,则被解释为false

let arr = [ 1, 2, 3, 4, 0 ]
let wanted = 'even'
const result = arr.filter(item => {
    const test = item % 2;
    if(wanted === 'odd' && test > 0) return true;
    if(wanted === 'even' && test === 0) return true;
  })
console.log(result)

您可以简化任何只返回由您的测试创建的布尔值:

let arr = [ 1, 2, 3, 4, 0 ]
let wanted = 'even'
const result = arr.filter(item => {
    if (wanted === 'odd') return item % 2
    if (wanted === 'even') return !(item % 2) 
  })
console.log(result)

【讨论】:

  • 您可以使用 XOR 进一步简化它(实际上是二进制 XOR,因为使用的值是 0s 和 1s):arr.filter(item => wanted === "odd" ^ item % 2)
  • 我从没想过@ibrahimmahrir。这很酷。
  • 谢谢大家,这真的很有帮助,提升了我对过滤器的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2020-02-24
  • 2016-10-28
  • 1970-01-01
  • 2021-03-08
  • 2017-12-18
相关资源
最近更新 更多