Если повторения должны учитываться, сравните частоты элементов через Map. Одинаковый набор уникальных значений ещё не означает равенства массивов как мультимножеств.
Проверка эквивалентности наборов элементов в массивах
Если повторения должны учитываться, сравните частоты элементов через Map. Одинаковый набор уникальных значений ещё не означает равенства массивов как мультимножеств.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию, которая определяет, совпадают ли элементы двух массивов, игнорируя их порядок.
//checkSimilarity([0,1,2], [2,1,0]) === true
//checkSimilarity([0,1], [2,1,0]) === false
//checkSimilarity([0,5,1], [0,1,5]) === true
checkSimilarity(arrA, arrB)
function checkSimilarity(arrA, arrB) {
}
Ответ
Если повторения должны учитываться, сравните частоты элементов через Map. Одинаковый набор уникальных значений ещё не означает равенства массивов как мультимножеств.
function checkSimilarity(a, b) {
if (a.length !== b.length) return false;
const counts = new Map();
for (const value of a) counts.set(value, (counts.get(value) ?? 0) + 1);
for (const value of b) {
const count = counts.get(value);
if (!count) return false;
if (count === 1) counts.delete(value);
else counts.set(value, count - 1);
}
return counts.size === 0;
}
Исходные массивы не меняются. Map использует SameValueZero: NaN совпадает с NaN, +0 с -0, а объекты сравниваются по ссылке. Ожидаемая сложность O(n) при стандартной хеш-реализации; если нужна структурная эквивалентность объектов, потребуется другой контракт сравнения.