比较JavaScript中的两个映射



我想问一下是否可以这样做:

const map1 = new Map();
map1.set('1', "led");
map1.set('2', "zeppelin");
const map2 = new Map();
map2.set('1', "led");
map2.set('2', "floyd");

我想比较这两张地图。我想有一个console.log()与映射的差异。

最后,如果map是相同的,我在map1中添加一个新的set

map1.set('3', "plant"); 

我想要一个日志来告诉我哪个是新的key -val

谢谢

const map1 = new Map();
map1.set('1', "led");
map1.set('2', "zeppelin");
const map2 = new Map();
map2.set('1', "led");
map2.set('2', "floyd");
let isSame = true;
map1.forEach(function(val, key){
if(map2.get(key) != val){
console.log('map1.'+key+' = '+val +' | map2.' + key + ' = 
'+map2.get(key));
isSame = false;
}
})
if(isSame){
map1.set('3', "plant"); 
map1.forEach(function(val, key){
console.log('map1.'+key+' => '+val);
})
}

这里是另一个使用Map#entries()Array#every()的解决方案。

这个解决方案检查提供的参数实际上是map,如果大小不匹配,立即返回false。只有通过了所有这些检查,才会对Map中的每个键和值进行实际比较,这将极大地改善平摊运行时。在最坏的情况下,运行时将是O(n),nmap1中键值对的数量。

键和值的比较是在严格相等的基础上进行的,这意味着不会对数组或对象进行深度比较。如果需要,可以使用lodash#isEqual()。对于给定的示例,这是不必要的。

const map1 = new Map();
map1.set("1", "led");
map1.set("2", "zeppelin");
const map2 = new Map();
map2.set("1", "led");
map2.set("2", "floyd");
const map3 = new Map();
map3.set("1", "led");
map3.set("2", "zeppelin");
function areEqual(map1, map2) {
// early outs
if(!(map1 instanceof Map) || !(map2 instanceof Map) || map1.size !== map2.size) return false;
// we know we have to maps with the same amount of keys and values. Now compare them
return [...map1.entries()].every(([key, value]) => (map2.has(key) && map2.get(key) === value));
}

console.log(areEqual(map1, map2));
console.log(areEqual(map1, map3));

最新更新