首页 > 解决方案 > Array.filter 也能够映射对象数组是否正常?

问题描述

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

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

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

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

标签: javascripttypescriptecmascript-6filter

解决方案


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

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

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

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


推荐阅读