比较 JavaScript 中的 2 张地图
Compare 2 maps in 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() 带有地图的引用。
最后,如果地图相同,我会在 map1 中添加一个新集
map1.set('3', "plant");
我想要一个日志来告诉我哪一对是新的 kay-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()
and Array#every()
的解决方案。
此解决方案检查提供的参数是否实际上是地图,如果大小不匹配,则立即 returns false
。只有通过所有这些检查,才会对 Map
中的每个键和值进行实际比较,这将大大改进 amortized runtime。在最坏的情况下,运行时间将是 O(n)
,其中 n
是 map1
.
中 key-value 对的数量
如果需要,键和值的比较是在 strict equality meaning that no deep comparison of arrays or objects is done. One could use 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));
我想问一下是否可以这样做:
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() 带有地图的引用。
最后,如果地图相同,我会在 map1 中添加一个新集
map1.set('3', "plant");
我想要一个日志来告诉我哪一对是新的 kay-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()
and Array#every()
的解决方案。
此解决方案检查提供的参数是否实际上是地图,如果大小不匹配,则立即 returns false
。只有通过所有这些检查,才会对 Map
中的每个键和值进行实际比较,这将大大改进 amortized runtime。在最坏的情况下,运行时间将是 O(n)
,其中 n
是 map1
.
如果需要,键和值的比较是在 strict equality meaning that no deep comparison of arrays or objects is done. One could use 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));