2015-06-19 11 views
1
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 переменных из к х, и мы хотели бы получить элемент пересечения из этих 5 массивов, без необходимости писать вложенную for..loop для каждого дело.Как найти общие элементы в списке массивов?

Пожалуйста, предложите идеальное решение этой проблемы.

+0

Что вы уже пробовали? Покажите нам свой код. Потому что это звучит как вопрос домашней работы/теста. – Andy

+0

StackOverflow не для кодовых предложений, это поможет вам исправить код, который вы пытаетесь получить, но не может. Если вы публикуете то, что вы пробовали, и мы помогаем вам понять, что не работает, вы узнаете намного больше. –

+0

@ Энди Я просто хорошо задаю вопросы и объясняю различные термины и понятия, которые не связаны с домашней работой или тестом, как упоминалось. – Vicheanak

ответ

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

Это один адский код кливера – Eric

1

Вот версия не-Mr.Fancy-штаны :)

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

Смежные вопросы