数组哈希表上的循环

loop over hash table of arrays

本文关键字:循环 哈希表 数组      更新时间:2023-09-26

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

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

我在JSFiddle中草拟了代码我现在的主要障碍是将给定的值数组与所有其他值数组进行比较——我有代码可以将任何数组与直接连续的数组进行比较代码变得相当复杂,有多个嵌套,坦率地说,我的脑子在转。

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

function countCommon(a, b) {
    return a.reduce(function(p, c, e) {
        return p + (b.indexOf(c) >= 0 ? 1 : 0);
    }, 0);
}

然后,您的问题被简化为(并非双关语)创建hash的所有可能的密钥对,并为每个密钥的数据评估上述函数:

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;
}

然后你只需要满足条件的配对:

var result = makePairs(hash).filter(function(pair) {
    return countCommon(hash[pair[0]], hash[pair[1]]) >= 3;
});

嘿,presto,只有一个嵌套循环!演示位置http://jsfiddle.net/alnitak/kxdngy7n/

您可以创建一个中间函数来查找这样的对:

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;
}