我有两个数组[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方法之一,所以我非常希望能得到一些建议。
我有两个数组[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方法之一,所以我非常希望能得到一些建议。
ES6,一个提案,包括Array#includes
。
includes()
方法确定数组是否包含某个元素,适当时返回true
或false
。
在每次循环aa
时,reduce将元素添加到结果数组中,如果值在测试数组bb
中找到。如果未找到,则返回先前的结果。
var aa = ['a','b','c','d'],
bb = ['b','d','f','h'],
cc = aa.reduce((r, a) => bb.includes(a) && r.concat(a) || r, []);
console.log(cc);
只需使用一个包含所有数组的单个数组,就可以更智能地处理。
var aa = ['a','b','c','d'],
bb = ['b','d','f','h'],
result = [aa, bb].reduce((a, b) => a.filter(c => b.includes(c)));
console.log(result);
reduce
来实现相同的结果的方法吗? - U r s u sReduce旨在从一组项目中返回单个值。因此,这里使用过滤器更有意义。
使用reduce的好方法是返回共同元素的总数。 在此处查看:https://jsfiddle.net/c69vgzL4/
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)
不仅限于两个数组,对于n个数组的交集...我们可以创造一个Array.prototype.intersect()
方法
Array.prototype.intersect = function(...a) {
return [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];
console.log(JSON.stringify(arr.intersect(...arrs)));
// or just do
console.log(JSON.stringify(["a","b","c","d"].intersect(["b","d","f","h"])));
JSON.stringify
吗? - U r s u s
reduce
实现filter
。 - Bergi