【问题标题】:Javascript: Finding shared values across multiple arrayJavascript:跨多个数组查找共享值
【发布时间】:2015-12-28 16:24:57
【问题描述】:

这应该能够做的是接收一个填充有一个字母值的二维数组,并返回一个包含所有共享值的数组。这是我目前所拥有的:

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

【问题讨论】:

  • 所以你想要一个函数,你可以传入任意数量的数组,然后取回公共值,而不管索引如何?
  • 第三个数组中没有y
  • 是的,我没有说清楚我是如何设置示例的,但是是的

标签: javascript arrays compare


【解决方案1】:

使用.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)

【讨论】:

    【解决方案2】:

    这是另一种方式,使用 Array 方法仅适用于 IE9 等。

    function compareValues() {
        var arrs = [].slice.call(arguments).sort(function(a,b) {
        	return a.length > b.length; // always iterate shortest array
        });
        
        return arrs.shift().filter(function(x, i) { // filter the first array
        	return arrs.every(function(arr) {       // if all other arrays
           	    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);

    【讨论】:

      【解决方案3】:

      这是与Array.prototype.reduce()Array.prototype.filter()Array.prototype.indexOf() 进行无损搜索的提议。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        相关资源
        最近更新 更多