且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

查找多个JavaScript阵列之间的匹配

更新时间:2022-10-15 13:04:02

  VAR的结果= arrays.shift()。过滤器(函数(五){
    返回arrays.every(函数(){
        返回a.indexOf(V)== -1!;
    });
});

DEMO: http://jsfiddle.net/nWjcp/2/

您可以先进行排序外阵列之初获得最短的阵列...

  arrays.sort(功能(A,B){
    返回则为a.length - b.length个;
});


有关完整性,这里是与数组中的重复交易的解决方案。它采用。降低()而不是 .filter() ...

  VAR的结果= arrays.shift()。降低(功能(RES,V){
    如果(res.indexOf(ⅴ)=== -1放大器;&放大器; arrays.every(功能(一){
        返回a.indexOf(V)== -1!;
    }))res.push(ⅴ);
    返回水库;
},[]);

DEMO: http://jsfiddle.net/nWjcp/4/

I have multiple arrays with string values and I want to compare them and only keep the matching results that are identical between ALL of them.

Given this example code:

var arr1 = ['apple', 'orange', 'banana', 'pear', 'fish', 'pancake', 'taco', 'pizza'];
var arr2 = ['taco', 'fish', 'apple', 'pizza'];
var arr3 = ['banana', 'pizza', 'fish', 'apple'];

I would like to to produce the following array that contains matches from all given arrays:

['apple', 'fish', 'pizza']

I know I can combine all the arrays with var newArr = arr1.concat(arr2, arr3); but that just give me an array with everything, plus the duplicates. Can this be done easily without needing the overhead of libraries such as underscore.js?

(Great, and now i'm hungry too!)

EDIT I suppose I should mention that there could be an unknown amount of arrays, I was just using 3 as an example.

var result = arrays.shift().filter(function(v) {
    return arrays.every(function(a) {
        return a.indexOf(v) !== -1;
    });
});

DEMO: http://jsfiddle.net/nWjcp/2/

You could first sort the outer Array to get the shortest Array at the beginning...

arrays.sort(function(a, b) {
    return a.length - b.length;
});


For completeness, here's a solution that deals with duplicates in the Arrays. It uses .reduce() instead of .filter()...

var result = arrays.shift().reduce(function(res, v) {
    if (res.indexOf(v) === -1 && arrays.every(function(a) {
        return a.indexOf(v) !== -1;
    })) res.push(v);
    return res;
}, []);

DEMO: http://jsfiddle.net/nWjcp/4/