Javascript 递归地获取所有子项

Javascript 递归地获取所有子项,javascript,recursion,Javascript,Recursion,我需要递归地从嵌套对象中获取所有子对象。 我已经写了一个函数来实现它(有点),但我认为它可以改进 我怎样才能使它更短更干净 我已经包括了我用于测试的数据以及我编写的需要改进的函数 let数据=[{ id:1, 儿童:{ id:2, 儿童:{ id:3, 儿童:{ id:4, 子项:空 } } } }, { id:5, 儿童:{ id:6, 子项:空 } } ]; //作用 对于(让cat提供数据){ cat.children=getCategoryChild(cat); 控制台日志(cat.c

我需要递归地从嵌套对象中获取所有子对象。 我已经写了一个函数来实现它(有点),但我认为它可以改进

我怎样才能使它更短更干净

我已经包括了我用于测试的数据以及我编写的需要改进的函数

let数据=[{
id:1,
儿童:{
id:2,
儿童:{
id:3,
儿童:{
id:4,
子项:空
}
}
}
},
{
id:5,
儿童:{
id:6,
子项:空
}
}
];
//作用
对于(让cat提供数据){
cat.children=getCategoryChild(cat);
控制台日志(cat.children)
}
函数getCategoryChild(cat){
设t=[];
if(cat.child!=null){
t、 推(猫儿);
设y=getCategoryChild(cat.child);
如果(y.长度>0){
为了(让我来谈谈y){
t、 推送(一)
}
}
}
返回t;

}
假设每个类别只有一个子类别

编辑以符合预期结果

function iterChildren(cat) {
  let c = cat, children = [];

  while (c.child) {
    children.push({id: c.child.id});
    c = c.child;
  }

  return {id: cat.id, children: children};
}

let newData = data.map(iterChildren);

您可以通过检查实际的
子属性来采用递归方法

函数转换(数组){
常量iter=o=>o?[{id:o.id},…iter(o.child)]:[];
返回array.map({id,child})=>({id,child:iter(child}));
}
var data=[{id:1,child:{id:2,child:{id:3,child:{id:4,child:null}}},{id:5,child:{id:6,child:null}}];
console.log(转换(数据))

.as控制台包装{max height:100%!important;top:0;}
我重新编写了函数。
它过滤猫,只返回每个猫的
id
child\u id
的对象

let output=[],
数据=[{
id:1,
儿童:{
id:2,
儿童:{
id:3,
儿童:{
id:4,
子项:空
}
}
}
},
{
id:5,
儿童:{
id:6,
子项:空
}
}
];
函数getCategoryChild(cat){
变量t=[{
id:cat.id,
子标识:空
/*在这里,您可以设置输出应包含的数据类型*/
}]
if(猫童){
t[0].child_id=cat.child.id
t=t.concat(getCategoryChild(cat.child))
}
返回t
}
对于(x个数据){
output=output.concat(getCategoryChild(x))
}

console.log(output)
未捕获的语法错误:意外标识符
,在修复逗号后,
未捕获的类型错误:无法读取未定义的
的属性“数据”,此时似乎不起作用moment@Carla是否希望所有子对象都位于一维数组中?每个类别是否只有一个子对象?代码暗示它确实如此,我只是想确保it@Carla显示您的预期输出。由于您要求帮助改进工作代码,这可能更适合于,但请确保先参观他们并阅读他们的帮助,特别是我不想要的。我想要像
[{id:1,children:[{id:2},{id:3},{id:4}]},{id:5,children:[{id:6}]}]
我编辑了这个问题并添加了预期的结果。这很好,但对于新手开发人员来说几乎难以理解:-)使用了太多像这种方法的新奇高级概念。非常简单和简洁。请在代码中添加一些解释,以便OP可以了解它是什么does@Carla较短的
(;c;c=c.child)产生{id:c.id}
data.map(({id,child:c})=>({id,children:[...{*0(){for(;c&&({id}=c);c=c.child)yield{id}}}[0]()]}))