2015-12-28 20 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>');