从对象递归创建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,你说得对。我已经更新了