Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 8

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

06.12.2020, 11:16. Показов 2241. Ответов 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
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru