2015-12-28 18 views
0

這應該能夠做到的是以二維數組填充一個字母值並返回所有共享值的數組。這是我到目前爲止有: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"]]; 

這將返回的預期陣列[ 「X」, 「X」]但是,當像這樣:

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

它返回[ 「X」, 「X」, 「x」]

正如你所看到的,兩個數組只能共享2個常見的x,但是代碼並不能在不同的情況下反映出來。此外,它應該能夠處理與其他字母排列,像這樣:

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

像這樣的東西,它應該返回[「X」,「X」,「Y」]作爲所有陣列共用2個普通X和1常見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

這裏的另一種方式,使用Array方法從IE9只availble的等

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>');