Как правило, вам придется просматривать вложенные данные не только для печати имен на консоль. По этой причине полезно разделить обход и вычислительный эффект -
const tree =
{name:'John',children:[{name:'Jim',children:[]},{name:'Zoe',children:[{name: 'Kyle',children:[]},{name:'Sophia',children:[]}]}]}
const traverse = function* (node = {})
{ yield node
if (node.children)
for (const c of node.children)
yield* traverse(c)
}
for (const node of traverse(tree)) // <-- traverse returns iterable
console.log(node.name) // <-- console.log not part of traverse
// John
// Jim
// Zoe
// Kyle
// Sophia
Мы можем повторно использовать traverse
для любого вида вычислений. Например, ниже мы используем заглавные буквы длиной более 3 символов -
const tree =
{name:'John',children:[{name:'Jim',children:[]},{name:'Zoe',children:[{name: 'Kyle',children:[]},{name:'Sophia',children:[]}]}]}
const traverse = function* (node = {})
{ yield node
if (node.children)
for (const c of node.children)
yield* traverse(c)
}
for (const node of traverse(tree))
if (node.name.length > 3)
console.log(node.name.toUpperCase())
// JOHN
// KYLE
// SOPHIA
Или мы можем собрать все имена в отсортированный массив -
const tree =
{name:'John',children:[{name:'Jim',children:[]},{name:'Zoe',children:[{name: 'Kyle',children:[]},{name:'Sophia',children:[]}]}]}
const traverse = function* (node = {})
{ yield node
if (node.children)
for (const c of node.children)
yield* traverse(c)
}
const allNames =
Array.from(traverse(tree), node => node.name).sort()
console.log(allNames)
// [ 'Jim', 'John', 'Kyle', 'Sophia', 'Zoe' ]