Осторожность
Этот репозиторий больше не поддерживается. Рассмотрим раздел ниже для альтернатив.
Преобразует множество элементов с идентификаторами и родительскими идентификаторами в вложенное дерево в результате исполнительного пути (сложности времени O(n) ). Бежит в браузерах и узле.
Другие пакеты имеют более строгие предположения или не такие исполнительные, как они часто используют вложенные петли или рекурсию. Например:
O-Unflatten требует, чтобы ввод был упорядочен таким образом, чтобы родительские узлы всегда были перед их детьми. Un-Flatten-Tree использует 2 вложенных петли (сложности времени O(n^2) ).
Эта реализация не требует какого -либо порядка элементов в массиве ввода и фокусируется на производительности времени выполнения. Это самый быстрый среди 4 различных пакетов, вы можете найти тесты здесь. Он использует индекс и одну петлю (сложности времени O(n) ). Это было вдохновлено этой дискуссией на Stackoverflow.
yarn add performant-array-to-tree
или при использовании NPM
npm install --save performant-array-to-tree
const tree = arrayToTree ( [
{ id : "4" , parentId : null , custom : "abc" } ,
{ id : "31" , parentId : "4" , custom : "12" } ,
{ id : "1941" , parentId : "418" , custom : "de" } ,
{ id : "1" , parentId : "418" , custom : "ZZZz" } ,
{ id : "418" , parentId : null , custom : "ü" } ,
] ) ;Что приводит к следующему массиву:
[
{
data : { id : "4" , parentId : null , custom : "abc" } ,
children : [
{ data : { id : "31" , parentId : "4" , custom : "12" } , children : [ ] } ,
] ,
} ,
{
data : { id : "418" , parentId : null , custom : "ü" } ,
children : [
{ data : { id : "1941" , parentId : "418" , custom : "de" } , children : [ ] } ,
{ data : { id : "1" , parentId : "418" , custom : "ZZZz" } , children : [ ] } ,
] ,
} ,
] ; Вы можете предоставить второй аргумент для ArrayTotree с параметрами конфигурации. Прямо сейчас вы можете установить следующее:
id : ключ поля идентификатора элемента. Также работает с вложенными свойствами (например, "nested.parentId" ). По умолчанию: "id" .parentId : ключ из поля идентификатора родителя элемента. Также работает с вложенными свойствами (например, "nested.parentId" ). По умолчанию: "parentId" .nestedIds : вариант включения/отключения вложенных идентификаторов. По умолчанию: true .childrenField : ключ, который будет содержать все дочерние узлы родительского узла. По умолчанию: "children"dataField : ключ, который будет содержать все свойства/данные исходных элементов. Установите NULL, если вам не хотите контейнер. По умолчанию: "data"throwIfOrphans : возможность бросить ошибку, если массив элементов содержит один или несколько предметов, в которых нет родителей в массиве или если массив элементов содержит предметы с круговыми отношениями с родителями/ребенком. Эта опция имеет небольшой штраф во время выполнения, поэтому по умолчанию он отключен. При включении функция выставит ошибку, содержащую парентид, которые не были найдены в массиве элементов, или в случае только для отношений с круглым элементом общей ошибкой. Функция бросит ошибку, если количество узлов в дереве меньше, чем количество узлов в исходном массиве. При отключении функция будет просто игнорировать сирот и круговые отношения и не добавлять их в дерево. По умолчанию: falserootParentIds : объект с родительскими идентификаторами в качестве ключей и true как значения, которые следует считать верхним или корневым элементом дерева. Это полезно, когда ваше дерево представляет собой подмножество полного дерева, что означает, что нет элемента, родительский идентификатор которого является undefined , null или '' . Массив, в котором вы проходите, заменит значение по умолчанию. undefined и null всегда считаются корневыми фары. Для получения более подробной информации см. № 23. По умолчанию: {'': true}assign : опция, которая позволяет Object.assign вместо оператора распространения создавать элемент в дереве, когда dataField является null . Это полезно, если у ваших элементов есть прототип, который следует поддерживать. Если включено и dataField является null , будет использоваться исходный элемент узла, а свойство children будет назначено, вызывая любые сеттеры в этом поле. Если dataField не является null , эта опция не имеет эффекта, так как исходный узел будет использоваться под dataField of нового объекта. Если вы не уверены, нужно ли вам включить это, вероятно, хорошо оставить это отключенным. По умолчанию: falseПример:
const tree = arrayToTree (
[
{ num : "4" , ref : null , custom : "abc" } ,
{ num : "31" , ref : "4" , custom : "12" } ,
{ num : "1941" , ref : "418" , custom : "de" } ,
{ num : "1" , ref : "418" , custom : "ZZZz" } ,
{ num : "418" , ref : null , custom : "ü" } ,
] ,
{ id : "num" , parentId : "ref" , childrenField : "nodes" }
) ;Который производит:
[
{
data : { num : "4" , ref : null , custom : "abc" } ,
nodes : [ { data : { num : "31" , ref : "4" , custom : "12" } , nodes : [ ] } ] ,
} ,
{
data : { num : "418" , ref : null , custom : "ü" } ,
nodes : [
{ data : { num : "1941" , ref : "418" , custom : "de" } , nodes : [ ] } ,
{ data : { num : "1" , ref : "418" , custom : "ZZZz" } , nodes : [ ] } ,
] ,
} ,
] ;Пример без поля данных:
const tree = arrayToTree (
[
{ id : "4" , parentId : null , custom : "abc" } ,
{ id : "31" , parentId : "4" , custom : "12" } ,
{ id : "1941" , parentId : "418" , custom : "de" } ,
{ id : "1" , parentId : "418" , custom : "ZZZz" } ,
{ id : "418" , parentId : null , custom : "ü" } ,
] ,
{ dataField : null }
) ;Который производит:
[
{
id : "4" ,
parentId : null ,
custom : "abc" ,
children : [ { id : "31" , parentId : "4" , custom : "12" , children : [ ] } ] ,
} ,
{
id : "418" ,
parentId : null ,
custom : "ü" ,
children : [
{ id : "1941" , parentId : "418" , custom : "de" , children : [ ] } ,
{ id : "1" , parentId : "418" , custom : "ZZZz" , children : [ ] } ,
] ,
} ,
] ;Пример с вложенным идентификатором/ParentId Properties:
const tree = arrayToTree (
[
{ num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
{ num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
] ,
{ id : "num.id" , parentId : "parent.parentId" }
) ;Который производит:
[
{
data : { num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
children : [
{
data : { num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
children : [ ] ,
} ,
] ,
} ,
] ; Этот проект включает в себя типы, просто импортируйте модуль, как обычно:
import { arrayToTree } from "performant-array-to-tree" ;
const tree = arrayToTree ( array ) ; yarn version для создания новой версии npm login npm publish --access public , чтобы опубликовать ее в NPM