a = [1, 2, 3, 4, 5]
b = [1, 3, 6, 4, 5, 9]
c = [5, 4, 7, 9]
d = [1, 7, 5, 6, 9, 4]
e = [4, 3, 5, 7, 1]
f = [...]
.
.
(n = [n,n,n])
对于许多情况中的1个,我们有5个变量,从 a 到 e ,我们希望从这5个数组中获取交集元素,而不必为每个案例编写嵌套for..loop。
请建议解决此问题的理想方案。
答案 0 :(得分:4)
首先找到第一个和第二个数组之间的公共元素,然后找到前一组公共元素和第三个数组之间的公共元素,依此类推。
var listOfArrays = [a, b, c, d, e, ...];
var commons = listOfArrays.slice(1).reduce(function(result, currentArray) {
return currentArray.filter(function(currentItem) {
return result.indexOf(currentItem) !== -1;
});
}, listOfArrays[0]);
下面,
currentArray.filter(function(currentItem) {...});
是负责查找两个数组result
和currentArray
之间的公共元素的函数。
我们使用Array.prototype.reduce
,其中传递给它的函数返回的值将在下一次迭代中反馈到同一函数。因此,我们继续将前一次迭代中的公共元素提供给下一次迭代。
答案 1 :(得分:1)
这是非Mr.Fancy-Pants版本:)
function findIntersection() {
// turns the list of arguments into an array
var args = Array.prototype.slice.call(arguments);
// concatenate all the arrays
var all = args.reduce(function (a, b) { return a.concat(b); });
// use the temporary object to store the number of times a
// number appears
for (var i = 0, obj = {}, l = all.length; i < l; i++) {
var key = all[i];
if (!obj[key]) obj[key] = 0;
obj[key]++;
}
// return those numbers that have a value matching the number
// of arguments passed into the function
return Object.keys(obj).filter(function (el) {
return obj[el] === args.length;
}).map(Number);
}
findIntersection(a,b,c,d,e); // [ "4", "5" ]