Introducción
En el desarrollo front-end, a menudo nos encontramos con datos estructurados en árbol, que pueden provenir de API back-end u otras fuentes de datos. Para procesar dichos datos de manera más conveniente, necesitamos convertirlos en una estructura plana para visualización u otras operaciones. En este blog, presentaremos dos métodos para aplanar la estructura de árbol en JavaScript: procesamiento recursivo y procesamiento no recursivo.
ejemplo de datos
Primero, damos datos de muestra, que representan datos de una estructura de árbol, cada nodo tiene atributos de identificación, identificación de padre y nombre.
const data = [
{ id: 1, parentId: 0, name: 'A' },
{ id: 2, parentId: 0, name: 'B' },
{ id: 3, parentId: 1, name: 'A-1' },
{ id: 4, parentId: 1, name: 'A-2' },
{ id: 5, parentId: 2, name: 'B-1' },
{ id: 6, parentId: 3, name: 'A-1-1' },
{ id: 7, parentId: 3, name: 'A-1-2' },
{ id: 8, parentId: 6, name: 'A-1-1-1' },
{ id: 9, parentId: 2, name: 'B-2' }
];
Método 1: procesamiento recursivo
El procesamiento recursivo es una forma común de procesar estructuras de árbol. Su idea básica es comenzar desde el nodo raíz, atravesar cada nodo del árbol capa por capa y agregar nodos secundarios a los atributos de los nodos principales correspondientes children
.
function formatDataTree (data){
let parents = data.filter(p => p.parentId == 0),
children = data.filter(c => c.parentId != 0);
dataToTree(parents, children);
return parents;
function dataToTree (parents, children) {
parents.map(p => {
children.map((c, i) => {
if (c.parentId == p.id) {
let _c = JSON.parse(JSON.stringify(children));
_c.splice(i, 1);
dataToTree([c], _c);
// if(p.children)
// p.children.push(c);
// else
// p.children = [c];
typeof p.children !== 'undefined' ? p.children.push(c) : p.children = [c];
}
});
});
}
}
análisis de código
- Primero, definimos
formatDataTree
la función, que toma como parámetro una matriz de datos estructurados en árbol. - Usamos
filter
el método para filtrar el nodo raíz y el nodo no raíz respectivamente, y obtenerparents
matriceschildren
. - Luego, llamamos
dataToTree
a la función para procesamiento recursivo. EndataToTree
la función, usamosmap
el método para atravesar cada nodo principal y usamosmap
el método para atravesar cada nodo secundario, encontrar su nodo principal y construir la estructura de árbol. Durante la recursividad, utilizamosJSON.parse(JSON.stringify(children))
para copiarchildren
la matriz para evitar modificar los datos originales. - Si se encuentra el nodo padre,
children
eliminamos el nodo hijo de la matriz y agregamos el nodo hijo a lachildren
propiedad del nodo padre.
Método 2: procesamiento no recursivo
El procesamiento no recursivo es un método para procesar estructuras de árbol utilizando estructuras de datos como pilas o colas. Evita la sobrecarga de rendimiento de las llamadas recursivas y, en general, se ejecuta más rápido.
function formatDataTree (data){
let _data= JSON.parse(JSON.stringify(data));
return _data.filter(p => {
const _arr= _data.filter(c => c.parentId === p.id);
_arr.length && (p.children= _arr);
return p.parentId === 0;
});
}
análisis de código
- Definimos
formatDataTree
la función, que toma como parámetro una matriz de datos estructurados en árbol. - En primer lugar, utilizamos para
JSON.parse(JSON.stringify(data))
hacer una copia de los datos_data
para evitar modificar los datos originales. - Luego, usamos
filter
el método para_data
filtrar. Para cada nodo principal,filter
encontramos todos sus nodos secundarios mediante el método_arr
y asignamos los nodos secundarios achildren
la propiedad del nodo principal. - Finalmente, devolvemos el nodo raíz, que
parentId
es 0.
resultado de la operación
Independientemente de si se utiliza procesamiento recursivo o no recursivo, el resultado de la operación será una matriz de estructura de árbol, en la que cada nodo contiene children
atributos para almacenar sus nodos secundarios. Para los datos de ejemplo dados, ambos enfoques darán el mismo resultado.
Resumir
Este blog presenta dos métodos para aplanar la estructura de árbol en JavaScript: procesamiento recursivo y procesamiento no recursivo. El procesamiento recursivo es un método comúnmente utilizado, pero puede haber problemas de rendimiento cuando los datos son grandes. El procesamiento no recursivo utiliza estructuras de datos como pilas o colas para evitar la sobrecarga de rendimiento de las llamadas recursivas y suele ser más rápido. Según las necesidades reales y la escala de datos, puede elegir un método apropiado para procesar datos estructurados en árbol para una mejor aplicación en el desarrollo front-end.