@jumper4

Как группировать объекты по заданному свойству с помощью reduce?

Добрый день!

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

const students = [
  { name: 'Tirion', class: 'B', mark: 3 },
  { name: 'Keit', class: 'A', mark: 3 },
  { name: 'Ramsey', class: 'A', mark: 4 },
];
 
groupBy([], ''); // {}
groupBy(students, 'mark');
// {
//   3: [
//     { name: "Tirion", class: "B", mark: 3 },
//     { name: "Keit", class: "A", mark: 3 },
//   ],
//   4: [
//     { name: "Ramsey", class: "A", mark: 4 },
//   ],
// }


Мой код следующий:

const groupBy = (usersArr, criteria) => {
  return usersArr.reduce((accum, user) => {
    let key = criteria;
    if (!_.has(accum, user.key)) {
      accum[user.key] = [];
    }
    accum[user.key].push(user);
    return accum;
  }, {});
};

console.log(groupBy(students, 'mark'));


Если я правильно понимаю, то вроде все написал по логике корректно, но есть проблема с аргументом criteria. Внутри reduce() criteria не видно, я создал переменную key и присвоил ей значение criteria. Criteria вроде стала видна, но теперь сама переменная key никак не функционирует в дальнейшем коде, будто ее нет.
Почему так происходит?
И верен ли в остальном код?
Нужно решить через reduce, и я знаю, что есть функция groupBy в lodash библиотеке. Смысл задачи и написать ее самому.

Спасибо за помощь!
  • Вопрос задан
  • 637 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Обращение к lodash.has() тоже навеное, недопустимо в задании?

Ошибка в том, что ключом назначаете criteria,
а надо значение этого свойства очередного юзера: key = user[criteria]
– так, если в criteria строка "mark", переменная key получит значение 3 у первого юзера.

spoiler
в одну нечитаемую строку:
const groupBy = (usersArr, criteria) => usersArr.reduce((acc, user) => ((acc[user[criteria]] ??= []).push(user), acc), {});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы