循环遍历数组的哈希表

时间:2014-10-20 17:28:39

标签: 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分享2,3和7

我在JSFiddle中草拟了代码。 我现在的主要障碍是将给定值数组与所有其他值数组进行比较 - 我有代码将任何数组与直接连续数组进行比较。代码变得非常复杂,有多个嵌套,坦白说我的头在旋转。

2 个答案:

答案 0 :(得分:1)

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

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/

进行演示

答案 1 :(得分:0)

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

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