0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 8

Парсинг объекта с неограниченной вложенностью

06.12.2020, 11:16. Показов 2260. Ответов 1

Студворк — интернет-сервис помощи студентам
Всем привет!
Я пытаюсь написать рекурсивную функцию, которая могла бы приводить получаемый с сервера объект к нужному виду:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
        id: 1,
        name: 'string',
        children: [
          { id: 2, name: 'string' },
          { id: 3, name: 'string' },
          { id: 4, name: 'string' }
        ]
      },
      {
        id: 5,
        name: 'string:',
        children: [
          {
            id: 6,
            name: 'string',
            children: [
              {
                id: 7,
                name: 'string',
                children: [
                  { id: 8, name: 'string' },
                  { id: 9, name: 'string' }
                ]
              }
            ]
          },
То, что я получаю с сервера:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const folders = [
  {
    id: 1000,
    pid: [
      0,
    ],
    index: [
      {
        0: 1,
      },
    ],
    name: 'Раздел (папка) 1000 - Уровень 1',
    have_children: true,
  },
  {
    id: 1100,
    pid: [
      0,
    ],
    index: [
      {
        0: 1,
      },
    ],
    name: 'Раздел (папка) 1100 - Уровень 1',
    have_children: true,
  },
  {
    id: 1200,
    pid: [
      0,
    ],
    index: [
      {
        0: 1,
      },
    ],
    name: 'Раздел (папка) 1200 - Уровень 1',
    have_children: true,
  },
  {
    id: 1001,
    pid: [
      1000,
    ],
    index: [
      {
        1000: 1,
      },
    ],
    name: 'Раздел (папка) 1001 - Уровень 2',
    have_children: false,
  },
  {
    id: 1002,
    pid: [
      1000,
    ],
    index: [
      {
        1000: 1,
      },
    ],
    name: 'Раздел (папка) 1002 - Уровень 2',
    have_children: false,
 
  },
  {
    id: 1101,
    pid: [
      1100,
    ],
    index: [
      {
        1100: 1,
      },
    ],
    name: 'Раздел (папка) 1101 - Уровень 2',
    have_children: false,
  },
];
const folders_h = [
  {
    id: 0,
    children: [
      1000,
      1100,
      1200,
    ],
  },
  {
    id: 1000,
    children: [
      1001,
      1002,
    ],
  },
  {
    id: 1100,
    children: [
      1101,
    ],
  },
];
const folders_root_id = 0;
То, что я написал на данный момент выводит только 2 уровня вложенности (код ниже). Я понимаю что тут надо сделать рекурсию, уже 2 дня пытаюсь решить эту задачу, но зараза вообще никак не выходит. Подскажите в какую сторону хотя бы смотреть, возможно ли это?
Я просто не понимаю, вот я передаю в рекурсивную функцию:
1) Объект типа { id, name } (далее Object).
2) Проверю есть ли у { id } дети.
2.1 Если нет, возвращаю передаваемый объект.
2.2 Если есть, пробегаюсь по folders_h (иерархии) и ищу там элемент с { id } и беру от туда массив childeren (включает в себя id). Далее создаю
JavaScript
1
Object['children'] = [];
И в цикле по каждому чилдрену прохожусь, добавляю о нем информацию в массив
JavaScript
1
Object['children].push( {id, name} )
.

Дальше я вообще не понимаю как мне для вложенного элемента добавить ещё один массив children.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const rootFolders = folders_h.find(f => f.id === folders_root_id).children;
const folderStructure = [];
 
const getFullFolder = (o, lastId) => {
  if (!lastId) {
    lastId = o.id;
  }
  if (folders_h.find(f => f.id === lastId)) {
    o['children'] = [];
    folders_h.find(f => f.id === lastId).children.forEach(ch => {
      o['children'].push({
        id: ch,
        name: getFolderName(ch)
      })
    })
  } 
  return o;
}
 
function getFolderName(id) {
  return folders.find(f => f.id === id).name;
}
 
rootFolders.forEach(rootFolderId => {
  const item = folders.find(folder => folder.id === rootFolderId);
  const baseFolder = {
    id: item.id,
    name: item.name
  };
 
  folderStructure.push(getFullFolder(baseFolder));
});
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.12.2020, 11:16
Ответы с готовыми решениями:

Вывод многоуровневого списка с неограниченной вложенностью
Здравствуйте, имеется таблица в бд со столбцами id, name, parent_id. Требуется вывести многоуровневый список из <ul> и <li>,...

как стилизовать многоуровневое меню с неограниченной вложенностью
Коллеги, всем привет Встал вопрос который написан в заголовке данной темы. суть следующая, есть разметка: <aside> ...

Вывод множества родительских категорий товара - с неограниченной вложенностью
Вывод множества родительских категорий товара - с неограниченной вложенностью правильно ли я сделал, потому что чувстую что как то проще...

1
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
07.12.2020, 01:34
Лучший ответ Сообщение было отмечено ofpato как решение

Решение

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        function buildFolder(srcnode)
        {
            let node = { "id": srcnode.id, "name": srcnode.name };
            if (node.have_children)
                node.children = folders.filter(v => v.pid == node.id).map(buildFolder);
            return node;
        }
 
        function idToObj(id)
        {
            return buildFolder(folders.find(v => v.id == id));
        }
        let result = [];
        for (let f of folders_h)
        {
            let children = f.children.map(idToObj);
            result.push({ "id": f.id, "children": children });
        }
 
        console.log(result);
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.12.2020, 01:34
Помогаю со студенческими работами здесь

Парсинг сайта с глубокой вложенностью
Есть сайт http://www.edu.ru/schools/catalog/ Каталог всех школ РФ по регионам. Можно ли каким-то образом (средствами php) выдрать...

Парсинг xml с глубокой вложенностью
Здравствуйте. Недавно начал осваивать Python и столкнулся с задачей распарсить файл xml с неизвестной вложенностью. Причем в результате...

Парсинг xml с очень большой вложенностью
Добрый день! Есть xml вида <hieder> <tag1>fvdfg</tag1> <tag2>bnn</tag1> <tag3> <tag4>fvbfhg</tag4> ...

Парсинг объекта
Всем доброго времени суток! В результате выполнения запроса получаю такой объект: { _Class = 5 "А", Name = Евгений, SurName =...

TRegExpr парсинг объекта
в общем есть примерно такой объект: "moderators": , "staff": , "admins": , "global_mods": , ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru