获取JavaScript中三个数组的交集

时间:2018-07-31 19:57:10

标签: javascript for-loop reduce

我需要制作一个检查3个数组的交集的实用程序。 这是我在JS中的实现:

function intersection(array1, array2, array3) {    
    let intermediateList = [];
    let intermediateList2 = [];
    for (let i = 0; i < array1.length; i++) {
        if (!(array2.indexOf(array1[i]) == -1)) {
            intermediateList.push(array1[i]);
        }        
        for (let j = 0; j < intermediateList.length; j++) {
            if (!(intermediateList.indexOf(array3[j]) == -1)) {
                intermediateList2.push(intermediateList[i]);
            }
        }
    }
    let endList = [ ...intermediateList, ...intermediateList2];
    return endList;    
}

intersection([5, 10, 15, 20], [15, 88, 1, 5, 7], [1, 10, 15, 5, 20])
//  [5, 15] /--> fine

intersection([5, 10, 15, 20, 40, 32], [32, 15, 88, 1, 5, 7, 40], [1, 10, 15, 5, 20, 40, 32])
// [5, 15, 40, 32, undefined, undefined, undefined] /--> can someone spot why do I get those undefined values?

您将如何使用reduce来实现这一点?

1 个答案:

答案 0 :(得分:3)

您的函数具有一个嵌套的for循环,该循环在每次外部循环运行时都对intermediateList进行迭代。然后,您用索引i而不是索引j推送一个值,但这仅在两个for循环不是嵌套而是链接的情况下才有效。

function intersection(array1, array2, array3) {
    let intermediateList = [];
    let intermediateList2 = [];
    for (let i = 0; i < array1.length; i++) {
        if (array2.indexOf(array1[i]) !== -1) {
            intermediateList.push(array1[i]);
        }
    }
    for (let j = 0; j < intermediateList.length; j++) {
        if (array3.indexOf(intermediateList[j]) !== -1) {
            intermediateList2.push(intermediateList[j]);
        }
    }
    return intermediateList2;
}

console.log(intersection([5, 10, 15, 20], [15, 88, 1, 5, 7], [1, 10, 15, 5, 20]));
console.log(intersection([5, 10, 15, 20, 40, 32], [32, 15, 88, 1, 5, 7, 40], [1, 10, 15, 5, 20, 40, 32]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

您可以减少参数并返回具有公共值的单个数组。

const intersection = (...array) => array.reduce((a, b) => a.filter(v => b.includes(v)));

console.log(intersection([5, 10, 15, 20], [15, 88, 1, 5, 7], [1, 10, 15, 5, 20]));
console.log(intersection([5, 10, 15, 20, 40, 32], [32, 15, 88, 1, 5, 7, 40], [1, 10, 15, 5, 20, 40, 32]));