Ожидаемый объект невозможен: два свойства с ключом '1' не могут одновременно хранить разные счётчики. Нужно различать типы в ключе либо изменить формат результата.
Подсчёт количества вхождений разных элементов массива, включая объекты
Ожидаемый объект невозможен: два свойства с ключом '1' не могут одновременно хранить разные счётчики. Нужно различать типы в ключе либо изменить формат результата.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача состоит в реализации функции, принимающей массив произвольных значений и возвращающей объект, где каждый ключ – это строковое представление элемента массива, а соответствующее значение – объект с полями value (исходный элемент) и count (число его появлений).
const mixedArray = [1, "1", { a: 1 }, { a: 1 }, 1, "test", "test"];
const countElements = () => {};
const counts = countElements(mixedArray);
console.log(counts);
// "1": { value: 1, count: 2 },
// "1": { value: "1", count: 1 },
// "{\"a\":1}": { value: { a: 1 }, count: 2 },
// "test": { value: "test", count: 2 }
Ответ
Ожидаемый объект невозможен: два свойства с ключом '1' не могут одновременно хранить разные счётчики. Нужно различать типы в ключе либо изменить формат результата.
Для приведённых JSON-совместимых данных можно явно использовать ключи с типом:
function countElements(values) {
const result = Object.create(null);
for (const value of values) {
const encoded = value !== null && typeof value === 'object'
? JSON.stringify(value) : String(value);
const key = typeof value + ':' + encoded;
if (result[key]) result[key].count++;
else result[key] = { value, count: 1 };
}
return result;
}
Число 1 и строка '1' попадут в number:1 и string:1. Это не универсальное сравнение произвольных объектов: циклы, функции, Symbol, порядок ключей и специальные типы требуют отдельного контракта. Для сравнения объектов по ссылке используйте Map; два литерала {a:1} тогда являются разными ключами.