Как проверить, имеют ли две карты одинаковый ключ в JavaScript - PullRequest
0 голосов
/ 26 августа 2018

Предположим, есть два объекта Карта , как проверить, совпадают ли их наборы ключей?

Например:

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

в этом случае оба *Карты 1008 * и B имеют одинаковый набор ключей (то есть ['x', 'y']), в то время как набор ключей C отличается, поскольку у него есть дополнительный ключ z.

Ответы [ 6 ]

0 голосов
/ 27 августа 2018

Вы можете создать новый 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));
0 голосов
/ 26 августа 2018

Вы можете проверить размер и взять прототип 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));
0 голосов
/ 26 августа 2018

Как правило, вам нужно проверить две вещи:

  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));
0 голосов
/ 26 августа 2018

Вы можете преобразовать ключи 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());
0 голосов
/ 26 августа 2018

Вы можете проверить размер, а затем перебрать ключи одной карты и убедиться, что они есть у другой.

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));
0 голосов
/ 26 августа 2018

Убедитесь, что 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));
...