Javascript 数组哈希表上的循环

Javascript 数组哈希表上的循环,javascript,arrays,hash,hashtable,Javascript,Arrays,Hash,Hashtable,我有一个数组哈希表,即: function (findPairs) { var arrMaster = []; var hash = { a: [1,2,3,4,5], b: [2,3,5,7,9], c: [7,2,3,8], d: [1,2] } return arrMaster } 我的目标是返回一个数组,该数组显示在其值数组中有三个公共元素实例的所有键对。例如,在上面的例子中: a股和b股2、3和5 b和c共享

我有一个数组哈希表,即:

function (findPairs) {

    var arrMaster = [];

    var hash = {

    a: [1,2,3,4,5],
    b: [2,3,5,7,9],
    c: [7,2,3,8],
    d: [1,2]

    }

   return arrMaster

}
我的目标是返回一个数组,该数组显示在其值数组中有三个公共元素实例的所有键对。例如,在上面的例子中:

  • a股和b股2、3和5
  • b和c共享2、3和7

我用手绘出代码我现在的主要障碍是将一个给定的值数组与所有其他值数组进行比较-我有一个代码,可以将任何数组与直接的连续数组进行比较。代码变得非常复杂,有多个嵌套,坦率地说,我的脑袋在打转

考虑更小的代码块,即如何计算一对数组中的公共元素数:

function countCommon(a, b) {
    return a.reduce(function(p, c, e) {
        return p + (b.indexOf(c) >= 0 ? 1 : 0);
    }, 0);
}
然后,您的问题被简化(没有双关语)为创建所有可能的
散列
键对,并为每个键的数据评估上述函数:

function makePairs(hash) {
    var result = [];
    var keys = Object.keys(hash);
    for (var i = 0, n = keys.length; i < n; ++i) {
        for (var j = i + 1; j < n; ++j) {
            result.push([keys[i], keys[j]]);
        }
    }
    return result;
}

嘿,普雷斯托,只有一个嵌套循环!演示在

您可以创建一个中间函数来查找配对,如下所示:

function isPair(first, second) {
    var values = {},
        pairsFound = 0;

    for (var i = 0; i < first.length; i++) {
        var str = first[i];
        values[str] = true;
    }

    for (var j = 0; j < second.length; j++) {
        if (values[second[j]] === true) {
            pairsFound++;
        }
    }

    return pairsFound > 3;
}
功能isPair(第一、第二){
var值={},
pairsFound=0;
对于(变量i=0;i3;
}

您需要确切地知道哪些元素是共享的,或者仅仅知道它们存在的事实吗?我将返回一个数组[[a,b],[b,c]],表示满足三个共享元素条件的密钥对。但在我看来,中间步骤需要一个临时数组来显示确切的共享元素。不,完全可以在不实际创建临时数组的情况下完成
function isPair(first, second) {
    var values = {},
        pairsFound = 0;

    for (var i = 0; i < first.length; i++) {
        var str = first[i];
        values[str] = true;
    }

    for (var j = 0; j < second.length; j++) {
        if (values[second[j]] === true) {
            pairsFound++;
        }
    }

    return pairsFound > 3;
}