具有绑定与未绑定函数的数组筛选器
Array filter with bound vs unbound function
所以我有这个代码来获得两个数组的交集:
var a = [1,2,3];
var b = [2,3,4];
var intersection = a.filter(x => b.includes(x));
得到了正确的CCD_ 1。但后来我想为什么不这样做:
var binc = b.includes.bind(b);
var intersection = a.filter(binc);
得到CCD_ 2。为什么?这是有效的:a.filter(x => binc(x))
、binc
和x => binc(x)
为每个输入返回相同的值。那个么,我在这里缺少的过滤器是干什么的呢?
在文档中,您可以看到Array#includes
接受两个参数:
searchElement
fromIndex
(数组中要搜索的位置)
因为你调用binc
的方式,它会得到[2,3]
0回调得到的所有参数:
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));
[]
0向回调传递三个参数:element
、index
和array
includes
接受两个参数:searchElement
和fromIndex
。
你可以试着自己弄清楚这两者是如何与其他参数相互作用的,从而产生不同的结果。。。
问题是includes(element, fromIndex)
方法在filter(value, index, currArray)
中调用时会占用不必要的第二个参数fromIndex
。这会中断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]"
相关文章:
- 无法通过数组映射绑定
- 使用knockout.js将数组绑定到视图模型
- 将角度材质设计复选框绑定到控制器中的数组
- 我正在尝试使用多个2数组来绑定svg圆的数据,但不知道如何绑定
- 值未与数组对象绑定
- 敲除:可观察数组没有被正确绑定——只有1个结果显示,而api返回6
- AngularJS-将数组值绑定到输入ngModel
- Dojo将索引0处的数据从数组绑定到小部件
- ng-repeat不绑定ng-model对象数组
- D3:使用变量访问绑定数组中的对象
- 如何使用 Knockout.js 绑定数组中的子数组
- 如何通过Angularjs绑定数组进行选择
- 是事件在Jquery中触发的与其事件绑定数相关联的数字
- 如何从共享工厂绑定数组或对象
- ASP中的模型绑定数组.净MVC
- 为什么我不能在AngularJs中双向绑定数组索引到模型?
- 如何在Vue.js中解绑定数组副本
- 在D3中绑定大数组
- KnockoutJS:绑定数组到多行引导网格
- 如何绑定数组到arraystore,以便在extjs中填充组合