代码之家  ›  专栏  ›  技术社区  ›  Francesco Borzi

如何在JavaScript中检查两个映射是否具有相同的密钥集

  •  0
  • Francesco Borzi  · 技术社区  · 8 年前

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

    6 回复  |  直到 8 年前
        1
  •  1
  •   Fabian N.    8 年前

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

    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));
        2
  •  5
  •   CertainPerformance    8 年前

    检查每张地图 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));
        3
  •  1
  •   Dez    8 年前

    通过扩展 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());
        4
  •  1
  •   amrender singh    8 年前

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

    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));
        5
  •  1
  •   Nina Scholz    8 年前

    你可以检查一下尺寸然后取 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));
        6
  •  0
  •   Fabian N.    8 年前

    你可以建造一个新的 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));
    推荐文章