Javascript 数组交集(集合论)与Array.prototype.reduce
我有两个数组Javascript 数组交集(集合论)与Array.prototype.reduce,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有两个数组[a,b,c,d]和[b,d,f,h] 我想得到一个包含公共元素的数组[b,d] 我可以通过组合使用filter和indexOf来实现这一点: [a,b,c,d].filter(el => [b,d,f,h].indexOf(el) !== -1) 但我想知道我是否可以,以及如何使用reduce实现同样的效果 我承认,尽管看了很多例子,reduce对我来说仍然是最模糊的JS方法之一,因此我非常感谢一些建议。reduce设计用于从项目列表中返回单个值。所以过滤器在这里更有意义
[a,b,c,d]
和[b,d,f,h]
我想得到一个包含公共元素的数组[b,d]
我可以通过组合使用filter
和indexOf
来实现这一点:
[a,b,c,d].filter(el => [b,d,f,h].indexOf(el) !== -1)
但我想知道我是否可以,以及如何使用reduce
实现同样的效果
我承认,尽管看了很多例子,
reduce
对我来说仍然是最模糊的JS方法之一,因此我非常感谢一些建议。reduce设计用于从项目列表中返回单个值。所以过滤器在这里更有意义
reduce的一个好用法是返回公共元素的总数。在这里查看:
ES6,一个带有
includes()
方法确定数组是否包含特定元素,并根据需要返回true
或false
在aa
的每个循环上,如果在测试数组bb
中找到值,reduce会将元素添加到结果数组中。如果未找到,则返回前一个结果
var aa=['a','b','c','d'],
bb=['b','d','f','h',],
cc=aa.减少((r,a)=>bb.包括(a)和&r.concat(a)| | r,[]);
控制台日志(cc)代码>不仅是两个数组,而且对于n个数组的交集。。。让我们发明Array.prototype.intersect()
Array.prototype.intersect=函数(…a){
返回[this,…a].reduce((p,c)=>p.filter(e=>c.includes(e));
}
var arrs=[[0,2,4,6,8],[4,5,6,7],[4,6],
arr=[0,1,2,3,4,5,6,7,8,9];
log(JSON.stringify(arr.intersect(…arrs));
//还是就这么做
log(JSON.stringify([“a”、“b”、“c”、“d”]).intersect([“b”、“d”、“f”、“h”))代码>我非常喜欢,谢谢!你知道一种使用reduce
只获得相同结果的方法吗?你的意思是没有include或indexof?是的,这可能是因为我不理解reduce
。回答得好,尼娜!我不知道你的代码的具体行为,所以我做了一些修改以便更好地理解你的代码。也许这会对某人有所帮助:-)@JoseHermosillaRodrigo,对,这是if的缩写形式。。。或者最好是三元。尝试使用reduce
实现filter
是否需要JSON.stringfy
?@U r s s实际上不需要,但它水平显示数组和对象。
var a = ['a','b','c','d']
var b = ['b','d','f','h']
var number_of_common = b.reduce(function(prev, next) {
return prev + (a.indexOf(next) + 1 ? 1 : 0)
}, 0)
$('body').html(number_of_common)