首页 > 解决方案 > 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"
                  }
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

标签: javascriptjson

解决方案


您可以将此 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


推荐阅读