Создайте объект без прототипа и для каждого элемента добавляйте его в массив по ключу callback. Это безопасно и для ключей вроде proto.
Самописный аналог Object.groupBy()
Создайте объект без прототипа и для каждого элемента добавляйте его в массив по ключу 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, возвращающего объект со сложным преобразованием в ключ.