我尝试找到一种解决方案来比较 JavaScript 中的两个哈希图,但我遇到了困难。
这是我的情况,我有一个由数组形式的
key + value
组成的哈希图。
示例:
125 : [1 , 2 , 3]
然后我获取这些数据并将其与另一个此类哈希图进行比较。
示例:
123 : [[1 , 1 , 1][2 , 8.7 , 10]]
124 : [[0 , 0, 5.4][3 , 4 , 5][7, 9.1 , 6]
125 : [[1 , 2 , 3][0.4 , 4 , 8]]
第二个 hashmap 与第一个类似,但它的值可以包含一个由 N 个数组组成的数组。目标:用我的第一个哈希图解析第二个哈希图,首先查找键是否相似,然后,如果一旦在第二个哈希图的数组中找到第一个哈希图的值,它必须返回“OK”
例如在这种情况下:它将返回
"OK"
,因为我们可以注意到第一个哈希图中的key 125
和她的value
包含在125 : [[1 , 2 , 3][0.4 , 4 , 8]]
中
我不仅应该测试数值,还应该测试按键
这是另一个例子:
请注意,第一个 hashmap 始终有 1 个数据(键 + 值)1 个键 + 1 个 1 维数组
第一个哈希图:
var hashmap1 = { 124 : [ 1,1,1] }
第二个哈希图:
var hashmap2 = {
123 : [0,0,0],
124 : [[ 0,1,1][0,0,1][1,1,1]]
125 : [9 , 8 , 7]
}
结果:“OK”,因为
124 : [1,1,1]
位于 124 :
[[ 0,1,1][0,0,1][1,1,1]
] 中。
const compareHashMap = (obj1, obj2) => {
const keys1 = Object.keys(obj1), keys2 = Object.keys(obj2);
let match = true;
if(keys1.length !== keys2.length) return false;
for(const key of keys1) {
if(obj1[key] !== obj2[key]) {
match = false;
break;
}
}
return match;
}
比较数组的一种简单方法是将它们字符串化并查看样本数组是否存在于另一个字符串中
let sample = {
'124': [9,9,9], // expect no match .. key exists but array differs
'125': [1, 2, 3], //expect match
'555':[8,8] // expect no match ... key doesn't exist
}
let data = {
'123': [ [1, 1, 1],[2, 8.7, 10]],
'124': [[0, 0, 5.4],[3, 4, 5],[7, 9.1, 6]],
'125': [[1, 2, 3],[0.4, 4, 8]]
}
let res = Object.keys(sample).map(key => {
let msg = 'OK';
if(!data.hasOwnProperty(key)){
msg= 'No Match';
}else{
let arrayMatch = JSON.stringify(data[key]).indexOf(JSON.stringify(sample[key])) >-1;
msg = !arrayMatch ? 'No Match' : msg;
}
return key + ' : ' + msg;
});
console.log(res.join('\n'))
你可以试试这个:
首先我们比较一下尺寸
然后我们循环判断map2的key和val是否与map1相同。
function equals(map1, map2) { if (map1.size !== map2.size) return false; for (let [key, val] of map1) { if (map2.get(key) !== val) return false; } return true; }