Введение
Исходный массив
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
groupBy(key)
: Внешняя функция принимает ключ (например, year
или artist
). group(array)
: Возвращаемая функция принимает массив для группировки. reduce
: Метод reduce
инициализирует аккумулятор как пустой объект и перебирает каждый элемент массива. property = obj[key]
: Получает значение свойства объекта для группировки. acc[property] = acc[property] || []
: Проверяет, существует ли массив для текущего значения свойства, и если нет, создает его. acc[property].push(obj)
: Добавляет объект в соответствующую группу.
groupBy