【问题标题】:Is it normal for Array.filter to also be able to map an array of objects?Array.filter 也能够映射对象数组是否正常?
【发布时间】:2021-05-09 23:54:21
【问题描述】:

不确定这是否真的是一个问题,但是当我在使用 Array.filter 时不小心没有使用相等检查时,我注意到了这一点。相反,当我觉得我应该因为不使用相等检查而收到某种错误时,它会映射我的数组:

const x = [{ name: 'user' }];
console.log(x.filter(x => x.name = 'another user'))

// Result:
// [{ name: 'another user' }]

这在任何地方都有记录吗?我觉得这不是故意的。我找不到任何关于 Array.filter 也能够映射的信息,所以我在这里问它。也许这属于github...

【问题讨论】:

  • 错字? x.name = 'another user' -> x.name === 'another user'? -- 老实说,我写这篇文章的时候还没有读完这个问题……
  • 不,因为这不是语法错误(您编写了有效代码),而是您的逻辑错误。如果您编写了有效代码,语言没有义务报告错误。
  • 每个数组方法都会调用每个项目上提供的回调。您正在更新每个对象的 x.name = 'another user'。赋值表达式也返回 another user 作为它的值。那是一个truthy 值。因此,原始数组中的每个对象都包含在输出中并更新。

标签: javascript typescript ecmascript-6 filter


【解决方案1】:

有许多数组方法可以很好地迭代数组的所有元素,除非以某种方式提前停止(例如通过抛出的错误,或通过回调到Array.every返回的虚假值,或通过返回的真实值通过回调到Array.find)。

这些方法都可能被误用来做一些他们不适合做的事情。没有例外,除了为副作用而设计的通用迭代方法。

是的,您可以通过在回调中执行副作用来滥用.filter 作为通用迭代方法的替代。例如,您也可以以完全相同的方式滥用.map

如果您希望能够保护自己免受此类拼写错误的影响,请考虑使用 linter 来警告您,例如使用 ESLint 的 no-return-assign

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多