Precaución
Este repositorio ya no se mantiene. Considere la sección a continuación para obtener alternativas.
Convierte una variedad de elementos con ID e ID de padres en un árbol anidado de forma performitante (complejidad de tiempo O(n) ). Se ejecuta en navegadores y nodo.
Otros paquetes tienen suposiciones más estrictas o no son tan actuantes, ya que a menudo usan bucles o recursión anidados. Por ejemplo:
O-Unflatten requiere que se ordene la aportación de tal manera que los nodos parentales siempre se presenten ante sus hijos. Un-Flatten-Tree usa 2 bucles anidados (complejidad del tiempo O(n^2) ).
Esta implementación no requiere ningún orden de elementos en la matriz de entrada y se centra en el rendimiento del tiempo de ejecución. Es el más rápido entre los 4 paquetes diferentes, puede encontrar los puntos de referencia aquí. Utiliza un índice y un bucle único (complejidad de tiempo O(n) ). Fue inspirado en esta discusión en Stackoverflow.
yarn add performant-array-to-tree
o si usa 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 : "ü" } ,
] ) ;Que resulta en la siguiente 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 : [ ] } ,
] ,
} ,
] ; Puede proporcionar un segundo argumento a ArrayTotree con opciones de configuración. En este momento, puede establecer lo siguiente:
id : clave del campo ID del elemento. También funciona con propiedades anidadas (por ejemplo, "nested.parentId" ). Valor predeterminado: "id" .parentId : clave del campo de identificación del padre del artículo. También funciona con propiedades anidadas (por ejemplo, "nested.parentId" ). Valor predeterminado: "parentId" .nestedIds : opción para habilitar/deshabilitar IDS anidados. Valor predeterminado: true .childrenField : clave que contendrá todos los nodos infantiles del nodo principal. Valor predeterminado: "children"dataField : clave que contendrá todas las propiedades/datos de los elementos originales. Establezca en nulo si no desea un contenedor. Valor predeterminado: "data"throwIfOrphans : opción para lanzar un error si la matriz de elementos contiene uno o más elementos que no tienen padres en la matriz o si la variedad de elementos contiene elementos con una relación circular de padres/hijos. Esta opción tiene una pequeña penalización de tiempo de ejecución, por lo que está deshabilitado de forma predeterminada. Cuando está habilitado, la función arrojará un error que contiene los Parentids que no se encontraron en la matriz de elementos, o en el caso de solo relaciones circulares de elementos un error genérico. La función arrojará un error si el número de nodos en el árbol es menor que el número de nodos en la matriz original. Cuando está deshabilitado, la función simplemente ignorará a los huérfanos y las relaciones circulares y no los agregará al árbol. Valor predeterminado: falserootParentIds : Objeto con ID de padres como teclas y true como valores que deben considerarse los elementos superiores o raíz del árbol. Esto es útil cuando su árbol es un subconjunto de árbol completo, lo que significa que no hay un elemento cuya identificación principal sea de undefined , null o '' . La matriz que pase será reemplazar el valor predeterminado. undefined y null siempre se consideran raíz en raíces. Para más detalles, ver #23. Predeterminado: {'': true}assign : Opción que habilita Object.assign en lugar del operador extendido para crear un elemento en el árbol cuando dataField es null . Esto es útil si sus elementos tienen un prototipo que debe mantenerse. Si está habilitado y dataField es null , se utilizará el elemento de nodo original y se asignará a la propiedad children , llamando a cualquier setter en ese campo. Si dataField no es null , esta opción no tiene efecto, ya que el nodo original se usará en el dataField de un nuevo objeto. Si no está seguro de si necesita habilitar esto, es probable que esté bien dejarlo deshabilitado. Valor predeterminado: falseEjemplo:
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 produce:
[
{
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 : [ ] } ,
] ,
} ,
] ;Ejemplo sin campo de datos:
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 produce:
[
{
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 : [ ] } ,
] ,
} ,
] ;Ejemplo con ID anidada/Propiedades de ParentId:
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 produce:
[
{
data : { num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
children : [
{
data : { num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
children : [ ] ,
} ,
] ,
} ,
] ; Este proyecto incluye tipos, solo importe el módulo como de costumbre:
import { arrayToTree } from "performant-array-to-tree" ;
const tree = arrayToTree ( array ) ; yarn version Para crear una nueva versión npm login npm publish --access public para publicarla en NPM