Cuidado
Este repositório não é mais mantido. Considere a seção abaixo para alternativas.
Converte uma variedade de itens com IDs e IDs dos pais em uma árvore aninhada de maneira performante (complexidade do tempo O(n) ). Corre em navegadores e nó.
Outros pacotes têm suposições mais rigorosas ou não são tão performantes, pois geralmente usam loops ou recursão aninhados. Por exemplo:
O-Unflatten exige que a entrada seja ordenada para que os nós dos pais sempre venham diante de seus filhos. O não fluxo usa 2 loops aninhados (complexidade do tempo O(n^2) ).
Essa implementação não requer nenhum pedido de itens na matriz de entrada e se concentra no desempenho do tempo de execução. É o mais rápido entre os quatro pacotes diferentes, você pode encontrar os benchmarks aqui. Ele usa um índice e um loop único (complexidade do tempo O(n) ). Foi inspirado nesta discussão sobre o StackOverflow.
yarn add performant-array-to-tree
ou se estiver usando o 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 : "ü" } ,
] ) ;O que resulta na seguinte matriz:
[
{
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 : [ ] } ,
] ,
} ,
] ; Você pode fornecer um segundo argumento para o ArrayToTree com as opções de configuração. No momento, você pode definir o seguinte:
id : Chave do campo ID do item. Também funciona com propriedades aninhadas (por exemplo, "nested.parentId" ). Padrão: "id" .parentId : Chave do campo de identificação do pai do item. Também funciona com propriedades aninhadas (por exemplo, "nested.parentId" ). Padrão: "parentId" .nestedIds : opção para ativar/desativar IDs aninhados. Padrão: true .childrenField : Chave que conterá todos os nós filhos do nó dos pais. Padrão: "children"dataField : chave que conterá todas as propriedades/dados dos itens originais. Defina como nulo se você não quiser um contêiner. Padrão: "data"throwIfOrphans : Opção para apresentar um erro se a matriz de itens contiver um ou mais itens que não têm pais na matriz ou se a matriz de itens contiver itens com um relacionamento circular pai/filho. Esta opção possui uma pequena penalidade de tempo de execução, por isso é desativado por padrão. Quando ativado, a função lançará um erro que contém os pais que não foram encontrados na matriz de itens, ou no caso de apenas relacionamentos circulares, um erro genérico. A função lançará um erro se o número de nós na árvore for menor que o número de nós na matriz original. Quando desativado, a função ignorará órfãos e relacionamentos circulares e não os adicionará à árvore. Padrão: falserootParentIds : Objeto com IDs dos pais como chaves e true como valores que devem ser considerados os elementos superior ou raiz da árvore. Isso é útil quando sua árvore é um subconjunto de árvore cheia, o que significa que não há item cujo identificação pai seja de undefined , null ou '' . A matriz que você passa será substituir o valor padrão. undefined e null são sempre considerados como rootparentídeos. Para mais detalhes, consulte #23. Padrão: {'': true}assign : opção que permite o Object.assign em vez do operador de spread para criar um item na árvore quando dataField for null . Isso é útil se seus itens tiverem um protótipo que deve ser mantido. Se ativado e dataField forem null , o item original do nó será usado e a propriedade children será atribuída, chamando qualquer setters nesse campo. Se dataField não for null , essa opção não terá efeito, pois o nó original será usado sob o dataField de um novo objeto. Se você não tiver certeza se precisa ativar isso, provavelmente é bom deixá -lo desativado. Padrão: falseExemplo:
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" }
) ;Que produz:
[
{
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 : [ ] } ,
] ,
} ,
] ;Exemplo sem campo de dados:
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 }
) ;Que produz:
[
{
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 : [ ] } ,
] ,
} ,
] ;Exemplo com propriedades de ID/Parentid aninhadas:
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" }
) ;Que produz:
[
{
data : { num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
children : [
{
data : { num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
children : [ ] ,
} ,
] ,
} ,
] ; Este projeto inclui tipos, basta importar o módulo como de costume:
import { arrayToTree } from "performant-array-to-tree" ;
const tree = arrayToTree ( array ) ; yarn version para criar uma nova versão npm login npm publish --access public para publicá -la no NPM