2015-12-28 4 views
0

Что это должно сделать, так это взять 2D-массив, заполненный с одним значением букв, и вернуть массив всех общих значений. Это то, что я до сих пор:Javascript: Поиск общих значений для нескольких массивов

var res = array[0].filter(function(x){ 
     return array.every(function(y){ 
      return y.indexOf(x) >= 0 
     }) 
    }); 
return res; 

Это в той или иной форме рабочего состояния, но только при определенных условиях, что делает его очень попало. Работа по назначению:

var array = [["x","x"], 
      ["x","x","x"]]; 

Это возвращает ожидаемый массив [ "х", "х"], но когда, как это:

var array = [["x","x","x"], 
      ["x","x"]]; 

возвращает [ "х", "х", «x»]

Как вы можете видеть, у двух массивов имеется только общий общий x, но код не отражает это в разных ситуациях. Кроме того, он должен быть в состоянии обрабатывать массивы с другими буквами так:

var array = [["x","x","z","y","y"], 
      ["x,"x","x","y"], 
      ["x","x","z","y"]]; 

С чем-то вроде этого он должен вернуться [ «х», «х», «у»], как все массивы разделяют 2 общих х и в 1 common y

+0

Итак, вы хотите функцию, которую вы можете передать в произвольное количество массивов до, а затем получить обратно общие ценности, независимо от индекса? – adeneo

+1

В третьем массиве нет 'y'. – void

+0

Да, я не объяснял, как я создал примеры, но да –

ответ

2

Используйте комбинацию .every и .filter, используйте .indexOf, чтобы проверить, существует ли элемент в массиве или нет.

var array = [ 
 
    ["x", "x", "z", "y", "y"], 
 
    ["x", "x", "x", "y"], 
 
    ["x", "x", "z", "y"] 
 
]; 
 

 
var res = array[0].filter(function(x) { 
 
    return array.every(function(y) { 
 
    if (y.indexOf(x) != -1) { 
 
     y[y.indexOf(x)] = Infinity; 
 
     return true; 
 
    } 
 
    return false; 
 
    }) 
 
}) 
 

 
alert(res)

0

Вот еще один способ, с помощью методов массива только экранном от IE9 и т.д.

function compareValues() { 
 
    var arrs = [].slice.call(arguments).sort(function(a,b) { 
 
    \t return a.length > b.length; // always iterate shortest array 
 
    }); 
 
    
 
    return arrs.shift().filter(function(x, i) { // filter the first array 
 
    \t return arrs.every(function(arr) {  // if all other arrays 
 
     \t  return arr[i] === x;    // have the same value at the same index 
 
     }) 
 
    }); 
 
} 
 

 
var result = compareValues(["x","x","x","y"], 
 
          ["x","x","z","y"], 
 
          ["x","x","z","y","y"]); 
 

 
alert(result);

0

Это предложение с Array.prototype.reduce(), Array.prototype.filter() и Array.prototype.indexOf() Fo r неразрушающий поиск.

var array = [ 
 
     ["x", "x", "z", "y", "y"], 
 
     ["x", "x", "x", "y"], 
 
     ["x", "x", "z", "y"] 
 
    ], 
 
    result = array.reduce(function (r, a) { 
 
     var last = {}; 
 
     return r.filter(function (b) { 
 
      var p = a.indexOf(b, last[b] || 0); 
 
      if (~p) { 
 
       last[b] = p + 1; 
 
       return true; 
 
      } 
 
     }); 
 
    }); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

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