Самописный аналог Object.groupBy()

Создайте объект без прототипа и для каждого элемента добавляйте его в массив по ключу callback. Это безопасно и для ключей вроде __proto__.

Короткий ответ

Что ответить на собеседовании

Создайте объект без прототипа и для каждого элемента добавляйте его в массив по ключу callback. Это безопасно и для ключей вроде proto.

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте собственный вариант метода Object.groupBy. Функция должна принимать массив объектов и callback‑функцию, которая определяет ключ группировки для каждого элемента. Результатом работы функции является объект, где каждому ключу соответствует массив элементов, попавших в эту группу.

const inventory = [
  { name: "asparagus", type: "vegetables", quantity: 9 },
  { name: "bananas", type: "fruit", quantity: 5 },
  { name: "goat", type: "meat", quantity: 23 },
  { name: "cherries", type: "fruit", quantity: 12 },
  { name: "fish", type: "meat", quantity: 22 },
];

const groupBy = (inventory, callback) => {

}

Ответ

Создайте объект без прототипа и для каждого элемента добавляйте его в массив по ключу callback. Это безопасно и для ключей вроде proto.

const groupBy = (inventory, callback) => {
  const groups = Object.create(null);
  let index = 0;
  for (const item of inventory) {
    const key = callback(item, index++);
    if (!Object.prototype.hasOwnProperty.call(groups, key)) groups[key] = [];
    groups[key].push(item);
  }
  return groups;
};
// groupBy(inventory, item => item.type)

Для обычных строковых и символьных ключей результат соответствует условию. Это учебная реализация, а не полный spec-polyfill для callback, возвращающего объект со сложным преобразованием в ключ.

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

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

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

Подробнее