所以我想要数组 arr1
中的元素恰好也属于数组 arr2
。我认为 arr1.filter(arr2.includes)
应该可以解决问题,但它给了我一个错误(见下文)。但奇怪的是,arr1.filter(x => arr2.incudes(x))
工作正常。尽管函数 arr2.includes
和 x => arr2.includes(x)
在引用上不相等,但它们不应该在相同的输入上采用相同的值吗?我在这里错过了什么?
> arr1 = ['a', 'b', 'c']
[ 'a', 'b', 'c' ]
> arr2 = ['a', 'c', 'd']
[ 'a', 'c', 'd' ]
>
> arr1.filter(x => arr2.includes(x))
[ 'a', 'c' ]
> arr1.filter(arr2.includes)
TypeError: Cannot convert undefined or null to object
at includes (<anonymous>)
at Array.filter (native)
at repl:1:6
... etc ...
最佳答案
有两个原因导致您不能只执行 arr1.filter(arr2.includes)
:
arr2.includes
只是对函数的引用,但您需要的是对函数的引用和 对您想要的数组的引用在 (arr2
) 上使用它。您可以使用Function.prototype.bind
解决该问题,但是:filter
为其回调传递多个参数,而不仅仅是一个:它传递值、其索引和原始数组。includes
将尝试使用它收到的第二个参数作为开始搜索的索引,因此当filter
将索引传递给它时,它将使用它并跳过前导条目.
所以通常的解决方案是使用一个包装函数,它知道它需要在 arr2
上使用 includes
并且知道只向它传递一个参数——这就是你已完成箭头功能。
但另见 Michał Perłakowski's answer从函数式编程的 Angular 寻找使用实用函数创建回调函数而不是内联创建回调函数的答案。
关于Javascript:回调中的无点样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504482/