所以我有这个代码来获取两个数组的交集:
var a = [1,2,3];
var b = [2,3,4];
var intersection = a.filter(x => b.includes(x));
我得到[2,3]
这是正确的。但后来我想为什么不这样做呢:
var binc = b.includes.bind(b);
var intersection = a.filter(binc);
我得到[]
。为什么?这有效:a.filter(x => binc(x))
,binc
和x => binc(x)
为每个输入返回相同的值。那么过滤器做了什么,我在这里失踪了?
答案 0 :(得分:1)
filter
将三个参数传递给回调:element
,index
和array
。
includes
接受两个参数:searchElement
和fromIndex
。
您可以尝试自己弄清楚两者如何与其他参数进行交互以产生不同的结果......
答案 1 :(得分:1)
In the documentation,您可以看到Array#includes
有两个参数:
searchElement
fromIndex
(要搜索的数组中的位置)由于您拨打binc
的方式,它将获得Array#filter
回调获得的所有参数:
value
(填充searchElement
)index
(填写fromIndex
并使includes
搜索失败)completearray
因此,您需要将回调传递给Array#filter
,该回调只会将所需的值传递到Array#includes
,以便fromIndex
未填充:
var a = [1,2,3];
var b = [2,3,4];
var binc = b.includes.bind(b);
var intersection = a.filter(x => binc(x));
答案 2 :(得分:0)
问题是includes(element, fromIndex)
方法在fromIndex
中调用时会采用不必要的第二个参数filter(value, index, currArray)
。这会中断includes()
方法执行。
为了使您的代码有效(仅用于研究,而不是用于生产),可以使用此方法:
var oldIncludes = Array.prototype.includes;
Array.prototype.includes = function(element) {
//use only the first argument: the element
return oldIncludes.call(this, element);
};
var a = [1,2,3];
var b = [2,3,4];
var binc = b.includes.bind(b);
var intersection = a.filter(binc);
console.log(interesection); //prints "[2, 3]"