0

假设有两个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);

在这种情况下,AB映射都具有相同的键集(即['x', 'y']),而键集 ofC不同,因为它具有额外的键z

4

7 回答 7

5

检查每个映射size是否相同,然后遍历keys其中一个Map并检查密钥是否也存在于另一个中。使用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));

于 2018-08-26T20:06:26.693 回答
1

您可以通过传播方法返回的迭代器将 Map 的键转换为数组keys()

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());

于 2018-08-26T20:12:26.753 回答
1

基本上你需要检查两件事:

  1. 两个地图的大小,如果它们不相等,则返回 false。
  2. 如果大小相同,则检查 map1 的所有键是否都存在于 map2 中,如果存在则返回 true,否则返回 false。

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));

于 2018-08-26T20:13:20.490 回答
1

您可以检查大小并使用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));

于 2018-08-26T20:26:41.123 回答
1

您可以检查大小,然后遍历一张地图的键并检查另一张地图是否也有它们。

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));

于 2018-08-26T20:10:36.287 回答
0

这是一个包裹在 TypeScript 化函数中的衬里

function sameKeys(a: Map<string, string>, b: Map<string, string>): boolean {
    return a.size === b.size && [...a.keys()].every(key => b.has(key))
}
于 2021-07-29T19:45:17.203 回答
0

您可以使用它们的两个条目构建一个新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));

于 2018-08-27T07:06:32.113 回答