@gsdev99

Как преобразовать данные?

Исходный массив:
const widgets = [
    {
        type: "Title",
        data: {
            title: "title1",
            subTitle: "subTitle1"
        }
    },
    {
        type: "Title",
        data: {
            title: "title2",
            subTitle: "subTitle2"
        }
    },
    {
        type: "Title",
        data: {
            title: "title3",
            subTitle: "subTitle3"
        }
    },
    {
        type: "New",
        data: {
            title: "new title1",
            subTitle: "new subTitle1"
        }
    },
    {
        type: "New",
        data: {
            title: "new title2",
            subTitle: "new subTitle2"
        }
    },
    {
        type: "NewTitle",
        data: {
            title: "NewTitle title1",
            subTitle: "NewTitle subTitle1"
        }
    },
]

Данные которые необходимо получить (объединение одинаковых типов в массив):
const widgetsTransform = [
    {
        type: "SectionTitle",
        children: [
            {
                type: "Title",
                data: {
                    title: "title1",
                    subTitle: "subTitle1"
                }
            },
            {
                type: "Title",
                data: {
                    title: "title2",
                    subTitle: "subTitle2"
                }
            },
            {
                type: "Title",
                data: {
                    title: "title3",
                    subTitle: "subTitle3"
                }
            }
        ]
    },
    {
        type: "SectionNew",
        children: [
            {
                type: "New",
                data: {
                    title: "new title1",
                    subTitle: "new subTitle1"
                }
            },
            {
                type: "New",
                data: {
                    title: "new title2",
                    subTitle: "new subTitle2"
                }
            }
        ]
    },
    {
        type: "NewTitle",
        data: {
            title: "NewTitle title1",
            subTitle: "NewTitle subTitle1"
        }
    },
]
  • Вопрос задан
  • 196 просмотров
Решения вопроса 3
@NikolayDolgushin
для этой цели подойдет уже готовое решение lodash .groupBy https://lodash.com/docs#groupBy,
а вот здесь есть пример использования https://stackoverflow.com/questions/23600897/using...
Ответ написан
Комментировать
@historydev Куратор тега JavaScript
Редактирую файлы с непонятными расширениями
const widgetsTransform = widgets.map(item => {
   let items = [];
   items.push({
       type: `Section${item.type}`,
       children: []
   });
   items.find(el => el.type.replace('Section', '') === item.type).children.push(item);
   return items
});

console.log(widgetsTransform);
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
const widgetsTransform = Object
  .values(widgets.reduce((acc, n) => ((acc[n.type] = acc[n.type] || []).push(n), acc), {}))
  .map(n => n.length > 1 ? ({ type: `Section${n[0].type}`, children: n }) : n[0]);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@darknefrit
А что много вариантов? Пройтись по каждому элементу объекта в цикле, проверить значение в поле type и в зависимости от значения копировать текущий объект в widgetsTransform в нужный массив children
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы