递归遍历节点的子节点

4
我有一个挑战,需要循环遍历一个具有嵌套子属性的数组对象,结构如下:
我尝试的遍历方式根本不行,实际上我希望结果是一个扁平的数组。
[{
element: 'a',
key: 'a',
isCollapsible: true,
isClickable: false,
children: [{
  element: 'a-1',
  key: 'a-1',
  indentChildren: false,
  children: [{
    element: 'a-1-1',
    key: 'a-1-1',
    children: [],
  }, {
    element: 'a-1-2',
    key: 'a-1-2',
    children: [],
  }],
}, {
  element: 'a-2',
  key: 'a-2',
  indentChildren: false,
  children: [{
    element: 'a-2-1',
    key: 'a-2-1',
    indentChildren: false,
    children: [{
      element: 'a-2-1-1',
      key: 'a-2-1-1',
      children: [],
    }],
  }, {
    element: 'a-2-2',
    key: 'a-2-2',
    children: [],
  }, {
    element: 'a-2-3',
    key: 'a-2-3',
    children: [],
  }],
}],
}]

2
请查看[帮助],特别是如何提出一个好的问题? 做好您的研究,搜索有关SO的相关主题,并尝试一下。如果您被卡住了,并且在做更多研究和搜索后无法摆脱困境,请发布您尝试的[minimal, complete, verifiable example (mcve)]并指出您卡住的具体位置。人们很乐意帮助您。祝好运! - T.J. Crowder
1
https://gist.github.com/penguinboy/762197 您可能要更改{}为数组,并向该数组添加没有键的元素。 - andnik
1个回答

3
自从ES6以来,您可以使用嵌套的yield生成器来展开迭代:
 function* flatten(array){
   for(const el of array){
     yield el;
     yield* flatten(el.children);
   }
}

所以你可以这样做:
 for(const el of flatten(yourdata)){
    //...
 }

哇!这一定是我生命中最美好的日子之一,我永远不会忘记这一天 :D,@Jonas,非常感谢,它起作用了。 - Thabo
@teebo 不用谢,很高兴能帮到你 :) 请也阅读一下MDN上关于迭代器和生成器的详细wiki - Jonas Wilms
那太优雅了! - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接