Martovitskiy
@Martovitskiy

Как сделать множественную группировку массива на JS?

Всем привет. Группировку на беке без проблем, но как сделать группировку объектов в массиве на js?

Нужно: сначала сгруппировать по order, потом по user_id, потом по stream_id и потом по currency_id
let arr = [
    {
        "order": 1151,
        "stream_id": "256",        
        "currency_id": 1,
        "language_id": 2,
        "balance": 0,
        "user_id": 66,
        "avatar_image": ""
    },
    {
        "order": 1151,
        "stream_id": "188",        
        "currency_id": 1,
        "language_id": 2,
        "balance": 0,
        "user_id": 58,
        "avatar_image": ""
    },
    {
        "order": 1151,
        "stream_id": "256",        
        "currency_id": 1,
        "language_id": 2,
        "balance": 840,
        "user_id": 58,
        "avatar_image": ""
    },
    {
        "order": 1152,
        "stream_id": "214",       
        "currency_id": 1,
        "language_id": 2,
        "balance": 256,
        "user_id": 62,
        "avatar_image": ""
    },
    {
        "order": 1021,
        "stream_id": "214",        
        "currency_id": 1,
        "language_id": 2,
        "balance": 0,
        "user_id": 66,
        "avatar_image": ""
    }
]

arr.map((n, i) => ({ ...n, id: i + 1 }));

const grouped = arr.reduce((acc, n) => {
  const g = n.order || n.stream_id;
  (acc[g] = acc[g] || []).push(n);
  return acc;
}, {});

Как дальше?
  • Вопрос задан
  • 286 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const group = (arr, ...keys) =>
  arr.reduce(((key, acc, n) => (
    (keys.reduce((obj, k) => obj[n[k]] ??= {}, acc)[n[key]] ??= []).push(n),
    acc
  )).bind(null, keys.pop()), {});


const grouped = group(arr, 'order', 'user_id', 'stream_id', 'currency_id');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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