从对象递归创建URL数组-javascript

从对象递归创建URL数组-javascript,javascript,recursion,Javascript,Recursion,我已经了解了如何基于数组创建对象,现在我正在尝试了解如何从该对象重新构建数组 带着这个物体 { social: { children: { swipes: { children: { women: null, men: null } } } },

我已经了解了如何基于数组创建对象,现在我正在尝试了解如何从该对象重新构建数组

带着这个物体

{ 
    social: { 
        children: { 
            swipes: {
                children: {
                    women: null,
                    men: null
                }
            } 
        } 
    },

    upgrade: { 
        children: { 
            premium: null 
        } 
    } 
 }
如何创建一个数组

['/social/swipes/women', '/social/swipes/men', '/upgrade/premium']
?

到目前为止,我刚刚编写了一个函数来迭代对象

let iterate=obj=>{
常量URL=[];
for(让k在obj中){
if(obj[k]!==null&&obj[k].hasOwnProperty('children')){
log('遍历键:',k)
迭代(obj[k].子对象)
}否则{
log(k,'为null')
}
}

}
您可以采取迭代和递归的方法,收集所有键,然后构建连接的字符串

函数getKeys(对象){
返回对象
.条目(对象)
.减少((r[k,v])=>
r、 concat(v&&typeof v=='object'&&v.children
?getkey(v.children).map(sub=>[k].concat(sub))
:k
),
[]
);
}
var data={social:{children:{swipes:{children:{women:null,men:null}}}},升级:{children:{premium:null}},
result=getKeys(data.map)(a=>a.join('/');

控制台日志(结果)这里有一个简单的递归方法,可以避免向路径中添加任何
子项
键:

constpathify=(数据,路径=”,res=[])=>{
Object.keys(数据).forEach(k=>{
if(数据[k]==null){
res.push(`${path}/${k}`);
} 
否则{
路径化(数据[k],路径+(k==“子”?:`/${k}`),res);
}
});
返回res;
};
console.log(
可悲({
社会:{
儿童:{
刷卡:{
儿童:{
女:空,
男:空
}
}
}
},
升级:{
儿童:{
溢价:空
}
}
})

);我会使用一个生成器:

 function* paths(obj, previous = "") {
   for(const [key, value] of Object.entries(obj)) {
     if(typeof value === "object" && value !== null) {
       yield* paths(value.children, previous + "/" + key);
     } else {
       yield previous + "/" + key;
    }
  }
}
这可以称为:

 console.log([...paths({ social: { /*...*/ } })]);

孩子们会怎么样?只有一个级别的孩子是很奇怪的。这似乎是个错误。@MarkMeyer,你说得对。我已经更新了