@BKaiyrbekov

Как правильно обойти объект JS для построения дерева?

есть массив:
[
                     {
                        id: 12,
                        obl: { id: 8, name: 'Название области', parent: null},
                        org: {id: 9, name: 'Название организаций', parent_obl: 8},
                        podr: {id: 8, name: 'Название Подразделение ', parent_org: 9},
                        dolzh: {id: 10, name: 'Программист'},
                        count: 4354
                    },
                    {
                        id: 13,
                        obl: { id: 5, name: 'Название области', parent: null},
                        org: {id: 6, name: 'Название организаций', parent_obl: 5},
                        podr: {id: 7, name: 'Название Подразделение ', parent_org: 6},
                        dolzh: {id: 10, name: 'Программист'},
                        count: 4354
                    },
                    {
                        id: 14,
                        obl: { id: 8, name: 'Название области', parent: null},
                        org: {id: 9, name: 'Название организаций', parent_obl: 8},
                        podr: {id: 8, name: 'Название Подразделение ', parent_org: 9},
                        dolzh: {id: 11, name: 'Администратор'},
                        count: 43
                    },
                    {
                        id: 15,
                        obl: { id: 11, name: 'Название области', parent: null},
                        org: {id: 12, name: 'Название организаций', parent_obl: 11},
                        podr: {id: 13, name: 'Название Подразделение ', parent_org: 12},
                        dolzh: {id: 10, name: 'Программист'},
                        count: 4354
                    },
]

Поле "parent, parent_obl, parent_org" можем отредактировать как хотим...


пользователь выбирает фильтре: области[obl] и по организацию[org] и подразделение[podr]
selectedKey: ['obl', 'org', 'podr']

и результат должно выйти так. как правильно написать функцию:
[
                    {
                        obl: { id: 8, name: 'Название области'},
                        dolzh: [
                            { id: 10, name: 'Программист'},
                            { id: 10, name: 'Администратор'},
                        ]
                        count: 2,
                        children: [
                            {
                                org: { id: 9, name: 'Название  организаций'},
                                dolzh: [
                                  { id: 10, name: 'Программист'},
                                  ]
                                 count: 1,
                                children: [
                                    {
                                        podr: {id: 8, name: 'Название Подразделение'},
                                        dolzh: [
                                           { id: 10, name: 'Программист'},
                                        ]
                                        count: 1,
                                        children: []
                                    }
                                ]
                            },
                            {
                                org: { id: 9, name: 'Название  организаций 2'},
                                        dolzh: [
                                           {id: 11, name: 'Администратор'},
                                        ]
                                        count: 1,
                                        children: [
                                    {
                                        podr: {id: 8, name: 'Название Подразделение'},
                                        dolzh: [
                                           { id: 11, name: 'Администратор'},
                                        ]
                                        count: 1,
                                        children: []
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        obl: { id: 5, name: 'Название области'},
                        dolzh: [
                                { id: 10, name: 'Программист'},
                           ]
                           count: 1,
                           children: [
                            {
                                org: { id: 6, name: 'Название организаций'},
                                dolzh: [
                                           { id: 10, name: 'Программист'},
                              ]
                                count: 1,
                                children: [
                                    {
                                        podr: {id: 7, name: 'Название Подразделение'},
                                        dolzh: [
                                           { id: 10, name: 'Программист'},
                                        ]
                                   count: 1,
                                        children: []
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        obl: { id: 11, name: 'Название области'},
                        dolzh: [
                              { id: 10, name: 'Программист'},
                         ]
                        count: 1,
                        children: [
                            {
                                org: { id: 12, name: 'Название организаций'},
                                dolzh: [
                                           { id: 10, name: 'Программист'},
                                        ]
                                count: 1,
                                children: [
                                    {
                                        podr: {id: 12, name: 'Название Подразделение'},
                                       dolzh: [
                                           { id: 10, name: 'Программист'},
                                        ]
                                   count: 1,
                                        children: []
                                    }
                                ]
                            }
                        ]
                    }
                ]


почему поля dolzh и count продублировано? потому что пользователи могут выбрать только "obl"
selectedKey: [ 'org' ]

и тогда результат:
[ {
                         obl: { id: 8, name: 'Название области'},
                        dolzh: [
                            { id: 10, name: 'Программист'},
                            { id: 10, name: 'Администратор'},
                        ]
                        count: 2,
                        children: []
                    }]


или пользователь порядок изменить
selectedKey: [ 'org', 'podr']

и тогда результат:
[
                            {
                                org: { id: 9, name: 'Название  организаций'}, 
                                dolzh: [
                                           { id: 11, name: 'Администратор'},
                                        ]
                                count: 1,
                                children: [
                                    {
                                        podr: {id: 8, name: 'Название Подразделение'},
                                        dolzh: [
                                           { id: 11, name: 'Администратор'},
                                        ]
                                        count: 1,
                                        children: []
                                    }
                                ]
                            }
                        ]
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function createTree(data) {
  const obl = {};
  const org = {};
  const podr = {};

  data.forEach(n => {
    obl[n.obl.id] = { ...n.obl, children: [] };
    org[n.org.id] = { ...n.org, children: [] };
    podr[n.podr.id] = { ...n.podr, children: [] };
  });

  data.forEach(n => podr[n.podr.id].children.push({ ...n.dolzh }));
  Object.values(org).forEach(n => obl[n.parent_obl].children.push(n));
  Object.values(podr).forEach(n => org[n.parent_org].children.push(n));

  return Object.values(obl);
}


const tree = createTree(arr);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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