具有绑定与未绑定功能的阵列过滤器

时间:2016-03-22 15:00:07

标签: javascript arrays

所以我有这个代码来获取两个数组的交集:

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))bincx => binc(x)为每个输入返回相同的值。那么过滤器做了什么,我在这里失踪了?

3 个答案:

答案 0 :(得分:1)

filter将三个参数传递给回调:elementindexarray
includes接受两个参数:searchElementfromIndex

您可以尝试自己弄清楚两者如何与其他参数进行交互以产生不同的结果......

答案 1 :(得分:1)

In the documentation,您可以看到Array#includes有两个参数:

  1. searchElement
  2. fromIndex(要搜索的数组中的位置)
  3. 由于您拨打binc的方式,它将获得Array#filter回调获得的所有参数:

    1. value(填充searchElement
    2. index(填写fromIndex并使includes搜索失败)
    3. completearray
    4. 因此,您需要将回调传递给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]"