<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Дерево из плоского массива функция на Javascript]]></title><description><![CDATA[<p dir="auto">Вот функция на JavaScript, которая строит дерево из плоского массива данных. В JavaScript мы будем использовать объекты и ссылки для создания иерархической структуры.</p>
<pre><code class="language-js">function getTree(dataset) {
    const tree = []; // Дерево будет массивом
    const dataById = new Map(); // Используем Map для хранения узлов

    // Создаем индексированный Map и инициализируем childs как массивы
    dataset.forEach(node =&gt; {
        dataById.set(node.id, { ...node, childs: [] });
    });

    // Строим дерево
    dataset.forEach(({ id, parent }) =&gt; {
        const node = dataById.get(id);
        if (!parent) {
            // Если узел не имеет родителя, он становится корневым
            tree.push(node);
        } else {
            // Иначе добавляем узел как дочерний к его родителю
            const parentNode = dataById.get(parent);
            if (parentNode) {
                parentNode.childs.push(node);
            }
        }
    });

    return tree;
}
</code></pre>
<h2>Объяснение кода</h2>
<p dir="auto">Функция возвращает массив tree, содержащий корневые узлы. Каждый узел может иметь дочерние элементы в массиве</p>
<h3>Инициализация</h3>
<p dir="auto">tree: Массив для хранения корневых узлов.<br />
dataById: Map, где ключ — id узла, значение — сам узел с добавленным свойством childs (пустой массив).</p>
<h3>Создание индекса (dataById)</h3>
<p dir="auto">Для каждого узла из dataset создается копия с добавлением пустого массива childs.<br />
Узел сохраняется в dataById по его id.</p>
<h3>Построение дерева</h3>
<p dir="auto">Для каждого узла проверяется наличие родителя (parent):</p>
<ul>
<li>Если родителя нет, узел добавляется в массив tree.</li>
<li>Если родитель есть, узел добавляется в массив childs родительского узла (если родитель существует).</li>
</ul>
<h2>Пример использования</h2>
<pre><code class="language-js">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));
</code></pre>
<p dir="auto">вывод:</p>
<pre><code class="language-json">[
  {
    "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": []
  }
]
</code></pre>
]]></description><link>https://forum.exlends.com/topic/115/derevo-iz-ploskogo-massiva-funkciya-na-javascript</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 03:14:30 GMT</lastBuildDate><atom:link href="https://forum.exlends.com/topic/115.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Apr 2025 11:58:03 GMT</pubDate><ttl>60</ttl></channel></rss>