数组哈希表上的循环
loop over hash table of arrays
我有一个数组哈希表,即:
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;
}
相关文章:
- 如何在JavaScript中实现哈希表
- 用JavaScript中的循环传递哈希表/字典
- 将 Javascript 哈希表用于多个 If Thens
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 使用 JavaScript 中的对象的哈希表功能
- 用于 C# 的类似 V8 的哈希表
- 如何在 JavaScript 中动态创建哈希表
- 如何使用 Node.JS 在哈希表中为每个键存储多个值
- 如何在 JavaScript 中实现哈希表
- 在引擎盖下,是Javascript对象哈希表
- 如何在java脚本中打印此哈希表数据
- 如何将 Python 字典转换为 JavaScript 哈希表
- 你如何观察 Knockout 中的 JavaScript 哈希表
- 已解决查询(关于哈希表)中的解决方案给了我 NaN
- 哈希表-给定密钥的哈希计算频率
- 与哈希表相比,通过循环访问数组中对象的Javascript优化
- 数组哈希表上的循环
- 访问哈希表中的元素
- 带有键/值的Javascript测试哈希表
- 如何在没有循环的情况下验证哈希表中包含的值