我有一个数组哈希表,即:
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
}
我的目标是返回一个数组,该数组显示在其值数组中具有三个公共元素实例的所有键对。例如,在上面的例子中:
我在JSFiddle中草拟了代码。 我现在的主要障碍是将给定值数组与所有其他值数组进行比较 - 我有代码将任何数组与直接连续数组进行比较。代码变得非常复杂,有多个嵌套,坦白说我的头在旋转。
答案 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;
}