javascript - 如何提取嵌套对象数组中“启用”对象的路径
问题描述
我是递归新手,我有一个带有嵌套对象数组的 JSON 结构。其中一些对象启用了布尔值:true。我试图弄清楚如何提取所有启用对象及其子对象的路径。
我尝试通过删除未使用的路径来清理原始对象,但我在访问父母时迷失了方向。我还尝试使用点符号构建一个单独的路径数组,因为我可能可以从中构建一个新的嵌套对象。我对点符号提取的最新尝试:
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'
]
在一个完美的世界中(但我尝试了几天并返回获取点符号结果):
{
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"
}
]
}
]
}
]
};
解决方案
enabled
如果在某些较高级别上找到真值并且基于该结果的添加路径,您可以将参数向下传递到较低级别的递归。
const data ={"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 paths(data, prev = '', enabled = false) {
const result = [];
prev += (prev ? "." : '') + data.title;
if (!enabled && data.enabled) enabled = true;
if (!data.tags) {
if (enabled) {
result.push(prev);
}
} else {
data.tags.forEach(el => result.push(...paths(el, prev, enabled)))
}
return result;
}
const result = paths(data)
console.log(result)
推荐阅读
- javascript - Javascript用数组解析输入名称
- python - 如何提高 EasyOCR 的准确性/预测?
- javascript - A-frame 让 gltf 模型始终在播放器前面略微跟随
- python-3.x - 如何使 wkhtmltopdf 在 Google Colab 上工作?
- c++ - 对 Class::Method 的调用没有匹配的函数
- sublime-text-plugin - sublime terminus 不对齐列,例如在 ls 命令中,或任何带有列的输出
- python - Python自引用列表在排序时产生奇怪的输出
- math - Calculus II Stewart - 如何求解这些向量方程
- python - 从字符串中删除所有双引号,然后向其添加双引号
- websocket - 通过 websockets 发送大数据包