Подсчёт количества вхождений разных элементов массива, включая объекты

Ожидаемый объект невозможен: два свойства с ключом '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} тогда являются разными ключами.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее