如何检查两个地图是否在 JavaScript 中设置了相同的键
How to check if two Maps have the same key set in JavaScript
假设有两个Map对象,如何检查它们的键集是否相同?
例如:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
在这种情况下,A
和 B
映射具有相同的键集(即 ['x', 'y']
),而 C
的键集不同,因为它有额外的钥匙 z
.
检查每个映射的 size
是否相同,然后遍历一个 Map
的 keys
并检查密钥是否也存在于另一个中。使用 Array.prototype.every.call
意味着不需要创建中间数组:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
const sameKeySet = (m1, m2) => (
m1.size === m2.size
&& Array.prototype.every.call(m1.keys(), key => m2.has(key))
);
console.log(sameKeySet(A, B));
console.log(sameKeySet(A, C));
您可以检查大小,然后遍历一个地图的键并检查另一个地图是否也有它们。
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
function sameKeys(a, b) {
if (a.size != b.size) {
return false;
}
for (let key in a.keys()) {
if (!b.has(key)) {
return false;
}
}
return true;
}
console.log(sameKeys(A, B));
console.log(sameKeys(A, C));
您可以通过扩展keys()
方法返回的迭代器将Map的键转换为数组:
const aKeys = [...A.keys()];
然后你只需要比较所有的键数组。对于你出现的情况,你可以简单地做:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
const aKeys = [...A.keys()];
const bKeys = [...B.keys()];
const cKeys = [...C.keys()];
console.log(aKeys.sort().toString() == bKeys.sort().toString());
console.log(aKeys.sort().toString() == cKeys.sort().toString());
console.log(bKeys.sort().toString() == cKeys.sort().toString());
基本上你需要检查两件事:
- 两个地图的大小,如果它们不相等则简单 return false。
- 如果大小相同,则检查 map1 的所有键是否都存在于 map2 中,如果它们比 return 正确,否则 return 错误。
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
const D = new Map();
C.set('x', 121);
C.set('z', 232);
function isSame(a,b){
if(a.size != b.size)
return false;
for(const [key, value] of a.entries()){
if(!b.has(key))
return false;
}
return true;
}
console.log(isSame(A,B));
console.log(isSame(A,C));
console.log(isSame(A,D));
您可以检查大小并以 has
和第二个映射为 thisArg
的原型来检查所有带有 Array#some
的键。
这适用于任何类型,因为它不会改变键的类型。
const
compare = (a, b) => a.size === b.size && [...a.keys()].some(Map.prototype.has, b),
a = new Map([['x', 123], ['y', 345]]);
b = new Map([['y', 567], ['x', 789]]);
c = new Map([['x', 121], ['y', 232], ['z', 434]]);
console.log(compare(a, b));
console.log(compare(a, c));
你可以用它们的两个条目构造一个新的Map
,然后比较大小。无论如何,你需要检查它们的大小,如果它们相同,那么你应该继续这样做。
map1.size.size
=== map2.size &&
new Map([...map1, ...map2])).size
=== map1.size
//或map2.size
让我们创建一个工作示例:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
let compareMap = (m1, m2) => (
m1.size === m2.size &&
(new Map([...m1, ...m2])).size === m1.size
)
console.log('Compare A & B: ', compareMap(A, B));
console.log('Compare A & C: ', compareMap(A, C));
console.log('Compare B & C: ', compareMap(B, C));
这是封装在 TypeScript 化函数中的一行代码
function sameKeys(a: Map<string, string>, b: Map<string, string>): boolean {
return a.size === b.size && [...a.keys()].every(key => b.has(key))
}
假设有两个Map对象,如何检查它们的键集是否相同?
例如:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
在这种情况下,A
和 B
映射具有相同的键集(即 ['x', 'y']
),而 C
的键集不同,因为它有额外的钥匙 z
.
检查每个映射的 size
是否相同,然后遍历一个 Map
的 keys
并检查密钥是否也存在于另一个中。使用 Array.prototype.every.call
意味着不需要创建中间数组:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
const sameKeySet = (m1, m2) => (
m1.size === m2.size
&& Array.prototype.every.call(m1.keys(), key => m2.has(key))
);
console.log(sameKeySet(A, B));
console.log(sameKeySet(A, C));
您可以检查大小,然后遍历一个地图的键并检查另一个地图是否也有它们。
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
function sameKeys(a, b) {
if (a.size != b.size) {
return false;
}
for (let key in a.keys()) {
if (!b.has(key)) {
return false;
}
}
return true;
}
console.log(sameKeys(A, B));
console.log(sameKeys(A, C));
您可以通过扩展keys()
方法返回的迭代器将Map的键转换为数组:
const aKeys = [...A.keys()];
然后你只需要比较所有的键数组。对于你出现的情况,你可以简单地做:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
const aKeys = [...A.keys()];
const bKeys = [...B.keys()];
const cKeys = [...C.keys()];
console.log(aKeys.sort().toString() == bKeys.sort().toString());
console.log(aKeys.sort().toString() == cKeys.sort().toString());
console.log(bKeys.sort().toString() == cKeys.sort().toString());
基本上你需要检查两件事:
- 两个地图的大小,如果它们不相等则简单 return false。
- 如果大小相同,则检查 map1 的所有键是否都存在于 map2 中,如果它们比 return 正确,否则 return 错误。
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
const D = new Map();
C.set('x', 121);
C.set('z', 232);
function isSame(a,b){
if(a.size != b.size)
return false;
for(const [key, value] of a.entries()){
if(!b.has(key))
return false;
}
return true;
}
console.log(isSame(A,B));
console.log(isSame(A,C));
console.log(isSame(A,D));
您可以检查大小并以 has
和第二个映射为 thisArg
的原型来检查所有带有 Array#some
的键。
这适用于任何类型,因为它不会改变键的类型。
const
compare = (a, b) => a.size === b.size && [...a.keys()].some(Map.prototype.has, b),
a = new Map([['x', 123], ['y', 345]]);
b = new Map([['y', 567], ['x', 789]]);
c = new Map([['x', 121], ['y', 232], ['z', 434]]);
console.log(compare(a, b));
console.log(compare(a, c));
你可以用它们的两个条目构造一个新的Map
,然后比较大小。无论如何,你需要检查它们的大小,如果它们相同,那么你应该继续这样做。
map1.size.size
=== map2.size &&
new Map([...map1, ...map2])).size
=== map1.size
//或map2.size
让我们创建一个工作示例:
const A = new Map();
A.set('x', 123);
A.set('y', 345);
const B = new Map();
B.set('y', 567);
B.set('x', 789);
const C = new Map();
C.set('x', 121);
C.set('y', 232);
C.set('z', 434);
let compareMap = (m1, m2) => (
m1.size === m2.size &&
(new Map([...m1, ...m2])).size === m1.size
)
console.log('Compare A & B: ', compareMap(A, B));
console.log('Compare A & C: ', compareMap(A, C));
console.log('Compare B & C: ', compareMap(B, C));
这是封装在 TypeScript 化函数中的一行代码
function sameKeys(a: Map<string, string>, b: Map<string, string>): boolean {
return a.size === b.size && [...a.keys()].every(key => b.has(key))
}