2012-05-31 2 views

ответ

0

Я думаю, что это должно сработать.

var arr1 = [1,2,3,4] 
    , arr2 = [2,3,4,5] 
    , arr3 = [3,4,5,6] 
    , arrs = [arr1, arr2, arr3]; 

var all = arr1.concat(arr2.concat(arr3)).sort() 
    , red1 = all.filter(
     function(val, i, arr) { 
      return i === arr.lastIndexOf(val)-1; 
     }) 
    , red2 = red1.filter(
     function(val, i, arr) { 
      var shared = true; 
      arrs.forEach(
       function(arr, i, src) { 
       if (arr.indexOf(val) === -1) 
        shared = false; 
       }) 
      return shared; 
     }) 
+0

Не может действительно следовать этому. Но я думаю, что это правильный путь. Согласовать все массивы и значения, которые происходят так часто, как количество массивов - общие значения. – BadKnees

+2

Прохладный пример того, как обфускать даже простой javascript с минимальными усилиями. – RobG

+0

Я согласен @RobG. BadKnees даже упомянул, что не мог следовать за ним, но все равно принял его. (Мой путь, возможно, был квитианским, но он оказался короче _and_ (по-моему) легче следовать.) – nnnnnn

2

Попробуйте найти значение в каждом из массивов, используя indexOF.

Я никогда не знал, что IE не поддерживает indexOf, но вот быстрое исправление от this post.

+0

Поддерживается только в 'IE> = 9'! но +1. – gdoron

2

Что-то, как это должно работать:

function getCommonElements() { 
    var common = [], 
     i, j; 

    if (arguments.length === 0) 
     return common; 

    outerLoop: 
    for (i = 0; i < arguments[0].length; i++) { 
     for (j = 1; j < arguments.length; j++) 
     if (-1 === arguments[j].indexOf(arguments[0][i])) 
      continue outerLoop; 

     common.push(arguments[0][i]); 
    } 
    return common; 
} 

вызова с любым количеством массивов в качестве аргументов:

var commonEls = getCommonElements(arr1, arr2, arr3, etc); 

В случае это не очевидно, что идея заключается в петлю через массив из первого аргумента и проверить каждый его элемент на другие массивы. Как только определенный элемент будет найден в , а не быть в любом из других массивов из других аргументов, продолжайте со следующего элемента. В противном случае добавьте текущий элемент в выходной массив, common.

Если вам нужна поддержка браузеров (IE < 9), которые не поддерживают Array.indexOf() method вы можете включить shim shown at the MDN page или заменить тест .indexOf() из моего кода с другим контуром.

0

Если вы озабочены только современными браузерами, которые поддерживают уменьшить(), а затем использовать это решение:

Finding matches between multiple JavaScript Arrays

Если вы должны поддерживать IE6, а затем использовать мое решение ниже. Вот как я это работает в IE6 с помощью JQuery:

// Find common values across all arrays in 'a', 
    // where 'a' is an array of arrays [[arr1], [arr2], ...] 
    Object.common = function(a) { 
    var aCommon = []; 
    for (var i=0,imax=a[0].length,nMatch,sVal; i<imax; i++) { 
     nMatch = 0; 
     sVal = a[0][i]; 
     for (var j=1,jmax=a.length; j<jmax; j++) { 
     nMatch += ($.inArray(sVal, a[j])>-1) ? 1 : 0; 
     } 
     if (nMatch===a.length-1) aCommon.push(sVal); 
    } 
    return aCommon; 
    } 

В принципе, вы просто цикл по каждому значению первого массива в «а», чтобы увидеть, если он существует в других массивах. Если он существует, вы увеличиваете nMatch, а после сканирования других массивов вы добавляете значение в массив aCommon, если nMatch равно общему числу других массивов.

Используя данные примера, предоставленные Флорианом Салиховичем, Object.common(arrs) вернет [3, 4].

Если вы не можете использовать JQuery, то замените $ .inArray() с кодом, предоставленной Mozilla:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/IndexOf

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