如何使用javascript从4个不同的数组中获取共同的价值

时间:2015-04-21 09:45:33

标签: javascript arrays

我有以下箭头,我想从所有四个数组获得共同的价值。我尝试下面的代码,它的工作,但不是我想要的正确方法。它不是在新数组中出现[2, 3]而是显示其他值,这些值至少在两个或三个数组中是常见的。

Fiddle Demo

我的代码

var a = [11, 2, 3, 4],
    b = [2,  6, 3, 5],
    c = [4, 2, 20, 3],
    d = [34, 2, 21, 5, 3],
    result = [],
    common = [];

function findCommon () {    
    for(var i = 0; i < arguments.length; i++){
        var garr = arguments[i];
        result = result.concat(arguments[i]);
    };
}
findCommon(a,b,c,d);

var sorted_arr = result.sort();

for(var i = 0; i< result.length-1; i++){

    if(result[i+1] == sorted_arr[i]){
        common.push(result[i]);
    }
};

alert(common); //[2, 2, 2, 3, 3, 4, 5]

5 个答案:

答案 0 :(得分:1)

试试这个:

function findCommon()
{
    var common=[];
    for(i=0; i<a.length; i++)
    {
       if(b.indexOf(i) != -1 && c.indexOf(i) != -1 && d.indexOf(i) != -1) 
       {
          common.push(i);
       }
    }
    return common;
}

这将返回所有四个数组之间的公共值数组。 Here is the working fiddle.

答案 1 :(得分:1)

您可以使用数组作为对象的值,并使用数字作为键。这样可以很容易地计算数字。请注意,此代码也是未来的证明,因此,如果您想要更少或更多的数组进行测试,这将让您。它还会对单个数组进行去重复,因此每个数组中的数字只计算一次以防止出错。

function findCommon() {
    var obj = {};
    var out = [];
    var result = [];

    // convert arguments to a proper array
    var args = [].slice.call(arguments);
    var len = args.length;
    for (var i = 0, l = len; i < l; i++) {

      // grab a de-duped array and and concatenate it
      // http://stackoverflow.com/a/9229821/1377002
      var unique = args[i].filter(function(item, pos) {
        return args[i].indexOf(item) == pos;
      });
      result = result.concat(unique);
    }
    for (var i = 0, l = result.length; i < l; i++) {
        var el = result[i];

        // if the object key doesn't exist, create an array
        // as the value; add the number to the array
        if (!obj[el]) obj[el] = [];
        obj[el].push(el);
    }
    for (var p in obj) {

     // if the array length equals the original length of
     // the number of arrays added to the function
     // add it to the output array, as an integer
     if (obj[p].length === len) out.push(+p);
    }
    return out;
}

findCommon(a, b, c, d); // [2]

此外,这会找到所有多个密钥,因此如果您将5中的d替换为3,结果将为[2, 3]

DEMO which uses 4 arrays, multiple hits

DEMO which uses 5 arrays

答案 2 :(得分:0)

您可以使用indexOf来解决这个问题:

array.indexOf(element) >=0 // it means that element is in array

array.indexOf(element) != -1

当你使用jQuery时,thre是一个较短的版本:

$.inArray(value, array)

更奇特的方式,就是使用过滤器(Filter):

function hasElement(element, index, array) {
  return element.indexOf(i) >= 0;
}
filtered = [a,b,c,d].filter(hasElement);
filtered.length  === 4

答案 3 :(得分:0)

假设你想要一些通用的X数组,我们正在谈论整数,这听起来像是一些桶业务。

var a = [11, 2, 3, 4],
    b = [2,  6, 3, 5],
    c = [4, 2, 20, 3],
    d = [34, 2, 21, 5];

function findCommon()
{
    var bucket = [];
    var maxVal = 0;
    var minVal = 0;

        for(var i = 0; i < arguments.length; i++)
        {
            for(var j = 0 ; j < arguments[i].length ; j++)
            {
                var val = arguments[i][j];
                bucket[val] = bucket[val] + 1 || 1;
                if(val > maxVal)
                {
                    maxVal = val;
                }
                else if(val < minVal)
                {
                    minVal = val;
                }
            }
        }

    var retVal = 0;
    var maxTimes = 0;
    for(var i = minVal ; i <= maxVal ; i++)
    {
        var val = bucket[i];
        if(val > maxTimes)
        {
            maxTimes = val;
            retVal = i;
        }
    }

    return retVal;
}

console.log(findCommon(a,b,c,d));

JSFIDDLE

答案 4 :(得分:0)

尝试,

会找到重复次数的公共号码。

&#13;
&#13;
var a = [11, 2, 3, 4],
    b = [2,  6, 3, 5],
    c = [4, 2, 20, 3],
    d = [34, 2, 21, 5],
    result = [],
    common = [];

var all = a.concat(b).concat(c).concat(d);


var commonNum=0;
var largestCounter=0
for(var i = 0; i< all.length-1; i++){
    var counter=0;
    if(a.indexOf(all[i])>-1) counter+=1;
    if(b.indexOf(all[i])>-1) counter+=1;
    if(c.indexOf(all[i])>-1) counter+=1;
    if(d.indexOf(all[i])>-1) counter+=1;
     
  if(counter>largestCounter)
    {largestCounter = counter;
     commonNum = all[i];
     }
    
  
   
};

alert(commonNum+" with count " + largestCounter);
&#13;
&#13;
&#13;