Javascript 如何提取到';启用';嵌套对象数组中的对象
我是递归的新手,我有一个包含嵌套对象数组的JSON结构。其中一些对象启用了布尔值:true。我试图找出如何提取所有启用对象及其子对象的路径 我试图通过删除未使用的路径来清理原始对象,但在访问父对象时迷失了方向。我还尝试使用点符号构建一个单独的路径数组,因为我可能可以从中构建一个新的嵌套对象。我最近一次尝试点符号提取:Javascript 如何提取到';启用';嵌套对象数组中的对象,javascript,arrays,recursion,Javascript,Arrays,Recursion,我是递归的新手,我有一个包含嵌套对象数组的JSON结构。其中一些对象启用了布尔值:true。我试图找出如何提取所有启用对象及其子对象的路径 我试图通过删除未使用的路径来清理原始对象,但在访问父对象时迷失了方向。我还尝试使用点符号构建一个单独的路径数组,因为我可能可以从中构建一个新的嵌套对象。我最近一次尝试点符号提取: const sourceData = { title: "Work", tags: [ { title: "C
const sourceData = {
title: "Work",
tags: [
{
title: "Cleaning",
tags: [
{
title: "Floors"
},
{ title: "Windows", enabled: true },
{ title: "Ceilings", enabled: true }
]
},
{
title: "Maintenance",
tags: [
{
title: "Walls",
enabled: true,
tags: [
{
title: "Brickwall"
},
{
title: "Wooden wall"
}
]
},
{
title: "Roof"
}
]
},
{
title: "Gardening"
}
]
};
function getEnabledPaths(level, acc) {
for (const tag of level.tags) {
if (tag.enabled) {
return tag.title;
} else if (tag.hasOwnProperty("tags")) {
var path = this.getEnabledPaths(tag);
if (path) acc.push(tag.title + "." + path);
}
}
return acc;
}
console.log(getEnabledPaths(sourceData, []));
我只得到:
[
"Cleaning.Windows",
"Maintenance.Walls"
]
我理想的结局是这样的:
[
'Work.Cleaning.Windows',
'Work.Cleaning.Ceilings',
'Work.Maintenance.Walls.Brickwall',
'Work.Maintenance.Walls.Wooden Wall'
]
在一个完美的世界中(但我尝试了几天,然后又回去得到点符号的结果):
如果在某些较高级别上找到真值,并且基于该结果添加路径,则可以将
enabled
参数向下传递到较低级别的递归
const data={“title”:“Work”,“tags”:[{“title”:“Cleaning”,“tags”:[{“title”:“Floors”},{“title”:“Windows”,“enabled”:true},{“title”:“designed”:true},{“title”:“Maintenance”,“tags”:[{“title”:“Walls”,“enabled”:true,“tags”:[{“title”:“Brickwall”},{“title”:“woodwall”},},{“title”:“Roof”},{“Roof”},{“grounding”},}
函数路径(数据,prev='',enabled=false){
常量结果=[];
prev+=(prev?.“:”)+data.title;
如果(!enabled&&data.enabled)enabled=true;
如果(!data.tags){
如果(已启用){
结果:推送(prev);
}
}否则{
data.tags.forEach(el=>result.push(…路径(el,prev,enabled)))
}
返回结果;
}
常量结果=路径(数据)
console.log(result)
递归函数的关键是a)处理子项和b)项本身
以下是我的观点,似乎很有效:
const sourceData={title:“工作”,标签:[{title:“清洁”,标签:[{title:“地板”},{title:“窗户”,enabled:true},{title:“天花板”,enabled:true},{title:“维护”,标签:[{title:“墙”,enabled:true,标签:[{{title:“砖墙”},{title:“木墙”},{title:“屋顶”},{title:“园艺”}};
函数项过滤器(项){
//启用?此项目已完成
如果(项目启用)返回项目;
//未启用且无标签?设置为空
如果(!item.tags)返回null;
//筛选所有子项,删除空子项
item.tags=item.tags.map(child=>itemFilter(child)).filter(child=>child);
退货项目;
}
log(itemFilter(sourceData))代码>
。作为控制台包装器{
最大高度:100vh!重要;
}
{
title: "Work",
tags: [
{
title: "Cleaning",
tags: [
{
title: "Windows",
enabled: true
},
{
title: "Ceilings",
enabled: true
}
]
},
{
title: "Maintenance",
tags: [
{
title: "Walls",
enabled: true,
tags: [
{
title: "Brickwall"
},
{
title: "Wooden wall"
}
]
}
]
}
]
};