如何在数组列表中找到公共元素?

时间:2015-06-19 13:18:10

标签: javascript arrays

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。

请建议解决此问题的理想方案。

2 个答案:

答案 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) {...});

是负责查找两个数组resultcurrentArray之间的公共元素的函数。

我们使用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" ]

DEMO