Создание функции группировки объектов в массиве по свойству

4cb6a849 6999 4a90 80f3 3ec4da94594b HTML

Введение

В этой статье мы рассмотрим, как создать функцию для группировки объектов в массиве по одному из их свойств. Это может быть полезно, когда необходимо структурировать данные по определенным критериям, например, по году или артисту.

Исходный массив

Рассмотрим массив объектов, представляющих альбомы музыкальных групп:

const albums = [
{
artist: "Pearl Jam",
album: "Ten",
year: "1991"
},
{
artist: "Pearl Jam",
album: "Yield",
year: "1998"
},
{
artist: "Soundgarden",
album: "Badmotorfinger",
year: "1991"
},
{
artist: "Soundgarden",
album: "Superunknown",
year: "1994"
}
];

Мы хотим сгруппировать эти объекты по свойству artist или year.

Результат

Группировка по годам (year):
{
1991: [
{
artist: 'Pearl Jam',
album: 'Ten',
year: '1991',
},
{
artist: 'Soundgarden',
album: 'Badmotorfinger',
year: '1991',
},
],
1994: [
{
artist: 'Soundgarden',
album: 'Superunknown',
year: '1994',
},
],
1998: [
{
artist: 'Pearl Jam',
album: 'Yield',
year: '1998',
},
]
}

Группировка по артисту (artist):

{
'Pearl Jam': [
{
artist: 'Pearl Jam',
album: 'Ten',
year: '1991',
},
{
artist: 'Pearl Jam',
album: 'Yield',
year: '1998',
},
],
'Soundgarden': [
{
artist: 'Soundgarden',
album: 'Badmotorfinger',
year: '1991',
},
{
artist: 'Soundgarden',
album: 'Superunknown',
year: '1994',
},
]
}

Реализация

Создадим функцию groupBy, которая принимает ключ для группировки и возвращает функцию, выполняющую группировку массива:

function groupBy(key) {
return function group(array) {
return array.reduce((acc, obj) => {
const property = obj[key];
if (!acc[property]) {
acc[property] = [];
}
acc[property].push(obj);
return acc;
}, {});
};
}

const groupByYear = groupBy("year");
console.log(groupByYear(albums));

const groupByArtist = groupBy("artist");
console.log(groupByArtist(albums));

Объяснение

Функция groupBy реализована с использованием каррирования, что позволяет нам передавать ключ для группировки и возвращать новую функцию, которая принимает массив объектов для группировки.

  1. groupBy(key): Внешняя функция принимает ключ (например, year или artist).
  2. group(array): Возвращаемая функция принимает массив для группировки.
  3. reduce: Метод reduce инициализирует аккумулятор как пустой объект и перебирает каждый элемент массива.
  4. property = obj[key]: Получает значение свойства объекта для группировки.
  5. acc[property] = acc[property] || []: Проверяет, существует ли массив для текущего значения свойства, и если нет, создает его.
  6. acc[property].push(obj): Добавляет объект в соответствующую группу.

Этот подход позволяет гибко группировать объекты по любому свойству, просто изменяя ключ в вызове функции groupBy.

Заключение

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

Оцените статью