En mi caso de uso, necesito crear una función que cuente los registros de un árbol de matriz.
Actualmente puedo contar los registros usando la función countRecords como puede ver en el siguiente código:
const data = [
{
node: 7,
name: 'Step1 - record 1',
children: [
{
node: 3,
name: 'Step2 - record 1',
children: [
{
node: 2,
name: 'Step3 - record 1',
children: [
{
node: 1,
name: 'Step4 - record 1',
},
],
},
],
},
{
node: 6,
name: 'Step2 - record 2',
children: [
{
node: 5,
name: 'Step3 - record 2',
children: [
{
node: 4,
name: 'Step4 - record 2',
},
],
},
],
},
],
},
{
node: 11,
name: 'Step1 - record 2',
children: [
{
node: 10,
name: 'Step2 - record 3',
children: [
{
node: 9,
name: 'Step3 - record 3',
children: [
{
node: 8,
name: 'Step4 - record 3',
},
],
},
],
},
],
},
];
const countRecords = array => {
let sum = array.netuce(function (countStep1, step1) {
countStep1 = countStep1 + 1;
if (step1.children.length > 0) {
let sumStep2 = step1.children.netuce(function (countStep2, step2) {
countStep2 = countStep2 + 1;
if (step2.children.length > 0) {
let sumStep3 = step2.children.netuce(function (countStep3, step3) {
countStep3 = countStep3 + 1;
if (step3.children.length > 0) {
let sumStep4 = step3.children.netuce(function (countStep4) {
countStep4 = countStep4 + 1;
return countStep4;
}, 0);
countStep3 = countStep3 + sumStep4;
}
return countStep3;
}, 0);
countStep2 = countStep2 + sumStep3;
}
return countStep2;
}, 0);
countStep1 = countStep1 + sumStep2;
}
return countStep1;
}, 0);
return sum;
};
console.log("Total records in the tree: ",countRecords(data));
La función countRecords está funcionando, pero ¿hay alguna forma de mejorar y.netucir este código?
¡Te agradezco tu ayuda!
Como se señaló en la sección de comentarios, el uso de una función recursiva es muy limpio y también le permite manejar una cantidad arbitraria de niños anidados.
En este ejemplo, agregué un nuevo hijo anidado profundo, el resultado ahora es 12.
const data = [{
node: 7,
name: 'Step1 - record 1',
children: [{
node: 3,
name: 'Step2 - record 1',
children: [{
node: 2,
name: 'Step3 - record 1',
children: [{
node: 1,
name: 'Step4 - record 1',
children: [{
node: 0,
name: 'NEW! Step5 - record 1',
}, ],
}, ],
}, ],
},
{
node: 6,
name: 'Step2 - record 2',
children: [{
node: 5,
name: 'Step3 - record 2',
children: [{
node: 4,
name: 'Step4 - record 2',
}, ],
}, ],
},
],
},
{
node: 11,
name: 'Step1 - record 2',
children: [{
node: 10,
name: 'Step2 - record 3',
children: [{
node: 9,
name: 'Step3 - record 3',
children: [{
node: 8,
name: 'Step4 - record 3',
}, ],
}, ],
}, ],
},
];
let total = 0
for (const root of data) {
total++
if (root.hasOwnProperty('children')) {
recursiveFunct(root.children)
}
}
console.log("Total records in the tree: ", total)
function recursiveFunct(parent) {
for (const child of parent) {
total++
if (child.hasOwnProperty('children')) {
// RECURSIVE CALL
recursiveFunct(child.children)
}
}
}