@crinnyx

Как сравнивать массивы не в порядке элементов?

язык жс, допустим есть два массива:
1) [1, 2, 3, 4]
2) [2, 4, 3, 1]

как мне их сравнивать на идентичность не в порядке элементов?
если через фор оф, будет через порядок, а как не?
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 2
0xD34F
@0xD34F Куратор тега JavaScript
function haveSameValues(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }

  const count = arr1.reduce((acc, n) => acc.set(n, (acc.get(n) ?? 0) + 1), new Map);
  arr2.forEach(n => count.set(n, (count.get(n) ?? 0) - 1));

  return Array.from(count.values()).every(n => n === 0);
}


haveSameValues(
  [ 'hello, world!!', 0, 0, 0, 1, 1, false, false ],
  [ false, false, 1, 1, 0, 0, 0, 'hello, world!!' ]
) // true

haveSameValues(
  [ 1, 2, 3 ],
  [ 3, 2, 2 ]
) // false

haveSameValues(
  [],
  []
) // true
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
План-А: отсортировать перед сравнением
const areEqual = (arrA, arrB) => {
  if (arrA.length !== arrB.length) return false;
  const a = arrA.slice().sort(), b = arrB.slice().sort();
  return a.every((el, i) => el === b[i]);
}


План-Б: хэш-таблица (значение: число элементов с таким значением). Посчитать в одном массиве, в другом, сравнить: должны совпасть. Это решение отлично реализовал в своём ответе 0xD34F

План-Х: удалять из копий совпадения по одному. Этот вариант неэффективен. Приведён для развлечения.
const areEqual = (arrA, arrB) => {
  if (arrA.length !== arrB.length) return false;
  const a = arrA.slice(), b = arrB.slice();
  while (a.length) {
    const i = b.indexOf(a.pop());
    if (-1 === i) return false;
    b.splice(i, 1);
  }
  return true;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы