@dc65k

Как сгруппировать массив объектов по двум свойствам?

Есть массив:

const orders = [
    {
        "date": "2017-10-16 12:07:07",
        "docTypesName": "Приход",
        "docId": 564564867361367,
        "image": "https://www.komus.ru/medias/sys_master/root/hd3/h93/9286922043422.jpg",
        "name": "Молочный Изюм 100",
        "price": 102,
        "quantity": 45,
        "removed": 0
    },
    {
        "date": "2017-10-16 12:07:07",
        "docTypesName": "Приход",
        "docId": 564564867361367,
        "image": "https://mariupolcena.com/files/products/9ff44136e6ccb0afb404ad26f727e67d.jpeg",
        "name": "Русская картошка чедар 50",
        "price": 46.3,
        "quantity": 45,
        "removed": 0
    },

    {
        "date": "2017-10-16 12:07:07",
        "docTypesName": "Расход",
        "docId": 564564867361367,
        "image": "https://mariupolcena.com/files/products/9ff44136e6ccb0afb404ad26f727e67d.jpeg",
        "name": "Русская картошка чедар 50",
        "price": 46.3,
        "quantity": 45,
        "removed": 0
    },

    {
        "date": "2017-11-29 17:26:57",
        "docTypesName": "Расход",
        "docId": 564564867361365,
        "image": "https://www.komus.ru/medias/sys_master/root/hd3/h93/9286922043422.jpg",
        "name": "Молочный Изюм 100",
        "price": 102,
        "quantity": 6,
        "removed": 0
    },
]

Структура, которую нужно получить:

export const orders = [
    {
        date: '2017-10-16',
        documents: [
            {
                date: "2017-10-16 12:07:07",
                docId: 564564867361367,
                docTypesName: 'Приход',
                products: [
                    {
                        "image": "https://www.komus.ru/medias/sys_master/root/hd3/h93/9286922043422.jpg",
                        "name": "Молочный Изюм 100",
                        "price": 102,
                        "quantity": 45,
                    },
                    {
                        "image": "https://mariupolcena.com/files/products/9ff44136e6ccb0afb404ad26f727e67d.jpeg",
                        "name": "Русская картошка чедар 50",
                        "price": 46.3,
                        "quantity": 45,
                    }
                ]
            },
            {
                date: "2017-10-16 12:07:07",
                docId: 564564867361367,
                docTypesName: 'Расход',
                products: [
                    {
                        "image": "https://mariupolcena.com/files/products/9ff44136e6ccb0afb404ad26f727e67d.jpeg",
                        "name": "Русская картошка чедар 50",
                        "price": 46.3,
                        "quantity": 45,
                    }
                ]
            }
        ]
    },
    {
        date: '2017-11-29',
        documents: [
            {
                date: "2017-11-29 17:26:57",
                docId: 564564867361365,
                docTypesName: 'Расход',
                products: [
                    {
                        "image": "https://www.komus.ru/medias/sys_master/root/hd3/h93/9286922043422.jpg",
                        "name": "Молочный Изюм 100",
                        "price": 102,
                        "quantity": 6,
                    }
                ]
            },
        ]
    }
]

Как это сделать?
  • Вопрос задан
  • 122 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Object.values(orders.reduce((acc, n) => {
  const date = n.date.split(' ')[0];

  ((acc[date] ??= {
    date,
    documents: {},
  }).documents[n.docTypesName] ??= {
    date: n.date,
    docId: n.docId,
    docTypesName: n.docTypesName,
    products: [],
  }).products.push({
    name: n.name,
    price: n.price,
    image: n.image,
    qunatity: n.quantity,
  });

  return acc;
}, {})).map(n => (n.documents = Object.values(n.documents), n))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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