javascript - JSON:在可变深度分支中访问特定的叶子
问题描述
所以,我有一个像这样构建的 JSON 对象(见下文),我试图访问不是“layerSection”类型的“layers”叶。我知道我可以使用 myJsonObject.layers[0].layers[0].layers[0].layers[0].name 之类的东西,但问题是,我永远不知道叶子会在它里面有多“深”分支。有时,根本没有“layerSection”层,但有时可能有十几个。(或更多......实际上“layerSection”的数量没有限制)
更糟糕的是,还有一些“空”分支,有几个“layerSection”层,末尾没有任何“正常”层。这些需要被忽略。
最后,一旦我到达叶子,我需要知道它实际上有多深。换句话说,我需要知道我必须经过多少“layerSection”才能到达叶子。
我不习惯处理像这样更复杂的 JSON 对象。任何帮助都会非常感激。
太感谢了 !
这是 json 对象:
{
"version": "1.6.1",
"timeStamp": 1592062633.423,
"layers": [
{
"id": 13,
"index": 10,
"type": "layerSection",
"name": "Group 1",
"layers": [
{
"id": 15,
"index": 9,
"type": "layerSection",
"name": "Group 2",
"layers": [
{
"id": 17,
"index": 8,
"type": "layerSection",
"name": "Group 3",
"layers": [
{
"id": 12,
"index": 7,
"type": "adjustmentLayer",
"name": "The leaf I am trying to get to",
"visible": true,
"clipped": true,
"adjustment": {
"presetKind": "presetKindDefault",
"class": "curves"
}
}
]
}
]
}
]
}
]
}
解决方案
您可以将此 JSON 结构视为树形数据结构。有一些方法可以获取树的叶子节点,这里我建议使用深度优先搜索来获取叶子层名称。
假设您定义一个叶子层是一个没有更多子层的层,那就是您返回层的名称。此函数返回 JSON 结构中的所有叶层名称以及它们在 JSON 中的深度。
function getLeafLayerNames(data, depth = 0) {
if (!data.layers) return [{ name: data.name, depth }]
const names = []
for (const layer of data.layers) {
const n = getLeafLayerNames(layer, depth + 1) // DFS recursive, depth increases by 1
names.push(...n)
}
return names.filter(n => n)
}
最后,我使用过滤器仅选择已定义的图层名称。当叶层中没有属性时,可以找到未定义的值name
。
推荐阅读
- python - 将两个二进制文件合并为第三个二进制文件
- python - UnboundLocalError:分配前引用的局部变量“x”(房地产价格预测项目)
- python - Google Colab 看不到 .so 文件
- android - 我可以在约束布局 (End_toStartOf) 中链接视图,以便它们包裹在窄屏幕上吗?
- node.js - 有什么方法可以在 node.js 中 30 分钟后运行查询?
- jquery - 带有 jquery 的下拉选择框
- javascript - Vue js - 在使用 v-for 生成的列表中显示/隐藏单个元素
- python - 带有 entry_point 控制台脚本的 Python 包分发
- html - Vue js 无法从嵌套的 v-for 拼接项目
- javascript - 获取与发布之间的区别