Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. JavaScript
  5. Дерево из плоского массива функция на Javascript

Дерево из плоского массива функция на Javascript

Запланировано Прикреплена Закрыта Перенесена JavaScript
1 Сообщения 1 Постеры 118 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • AladdinA Не в сети
    AladdinA Не в сети
    Aladdin
    js
    написал в отредактировано Aladdin
    #1

    Вот функция на JavaScript, которая строит дерево из плоского массива данных. В JavaScript мы будем использовать объекты и ссылки для создания иерархической структуры.

    function getTree(dataset) {
        const tree = []; // Дерево будет массивом
        const dataById = new Map(); // Используем Map для хранения узлов
    
        // Создаем индексированный Map и инициализируем childs как массивы
        dataset.forEach(node => {
            dataById.set(node.id, { ...node, childs: [] });
        });
    
        // Строим дерево
        dataset.forEach(({ id, parent }) => {
            const node = dataById.get(id);
            if (!parent) {
                // Если узел не имеет родителя, он становится корневым
                tree.push(node);
            } else {
                // Иначе добавляем узел как дочерний к его родителю
                const parentNode = dataById.get(parent);
                if (parentNode) {
                    parentNode.childs.push(node);
                }
            }
        });
    
        return tree;
    }
    

    Объяснение кода

    Функция возвращает массив tree, содержащий корневые узлы. Каждый узел может иметь дочерние элементы в массиве

    Инициализация

    tree: Массив для хранения корневых узлов.
    dataById: Map, где ключ — id узла, значение — сам узел с добавленным свойством childs (пустой массив).

    Создание индекса (dataById)

    Для каждого узла из dataset создается копия с добавлением пустого массива childs.
    Узел сохраняется в dataById по его id.

    Построение дерева

    Для каждого узла проверяется наличие родителя (parent):

    • Если родителя нет, узел добавляется в массив tree.
    • Если родитель есть, узел добавляется в массив childs родительского узла (если родитель существует).

    Пример использования

    const dataset = [
        { id: 1, parent: null, name: "Root" },
        { id: 2, parent: 1, name: "Child 1" },
        { id: 3, parent: 1, name: "Child 2" },
        { id: 4, parent: 2, name: "Grandchild 1" },
        { id: 5, parent: null, name: "Another Root" }
    ];
    
    const tree = getTree(dataset);
    console.log(JSON.stringify(tree, null, 2));
    

    вывод:

    [
      {
        "id": 1,
        "parent": null,
        "name": "Root",
        "childs": [
          {
            "id": 2,
            "parent": 1,
            "name": "Child 1",
            "childs": [
              {
                "id": 4,
                "parent": 2,
                "name": "Grandchild 1",
                "childs": []
              }
            ]
          },
          {
            "id": 3,
            "parent": 1,
            "name": "Child 2",
            "childs": []
          }
        ]
      },
      {
        "id": 5,
        "parent": null,
        "name": "Another Root",
        "childs": []
      }
    ]
    
    1 ответ Последний ответ
    👍
    1

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com
    • Наш чат
    • Наш ТГ канал

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы