首页 > 解决方案 > 如何到达 json 嵌套的最后一层并动态格式化输出?

问题描述

我有这个json:

[
  {
    "name": "MARVEL",
    "superheroes": "yes"
  },
  {
    "name": "Big Bang Theroy",
    "superheroes": "NO",
    "children": [
      {
        "name": "Sheldon",
        "superheroes": "NO"
      }
    ]
  },
  {
    "name": "dragon ball",
    "superheroes": "YES",
    "children": [
      {
        "name": "goku",
        "superheroes": "yes",
        "children": [
          {
            "name": "gohan",
            "superheroes": "YES"
          }
        ]
      }
    ]
  }
]

我知道如何循环并通过它,但我需要这样的输出:

[
  {
    "name": "MARVEL",
    "answer": [
      {
        "there_are_superheroes": "YES"
      }
    ]
  },
  {
    "name": "Big Bang Theroy",
    "answer": [
      {
        "there_are_superheroes": "NO",
        "new_leaft": [
          {
            "name": "sheldon",
            "there_are_superheroes": "NO"
          }
        ]
      }
    ]
  },
  {
    "name": "dragon ball",
    "answer": [
      {
        "there_are_superheroes": "YES",
        "new_leaft": [
          {
            "name": "goku",
            "answer": [
              {
                "there_are_superheroes": "YES",
                "new_leaft": [
                  {
                    "name": "gohan",
                    "answer": [
                      {
                        "there_are_superheroes": "YES"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

我试过这样的事情:

format(d) {
if (d.children) {
  d.children.forEach((d) => {
    format;
  });
}
}
format(data);

我不知道如何获得我想要的结构。foreach我曾尝试children使用. 在我的真实项目中,我从 Web 服务中获得了一个结构,我需要像这样构建它。nchildren

名为的属性superheroes我希望它显示在一个名为的数组answer中,并且在其中,there_are_superheroes它将具有它的值。

 "name": "MARVEL",
 "answer": [
        {
          "there_are_superheroes": "YES",  --> `there_are_superheroes` was `superheroes`,
          "new_leaft": [
                    {
 .
 .

并且new_leaft相当于children

正如我所说,我知道如何遍历对象和数组,但在这种情况下,我不知道如何遍历children nested每个对象的最后一个。

标签: javascript

解决方案


这是如何进行一级递归:

function format(l){
    const result = {name: l.name};
    result.answer = [{there_are_superheroes: l.superheroes}];
    result.answer[0].new_leaft = l.children;
    return result;
}
format({
      "name": "Big Bang Theroy",
      "superheroes": "NO",
      "children": [
        {
          "name": "Sheldon",
          "superheroes": "NO"
        }
      ]
    })

// result:

{
    "name": "Big Bang Theroy",
    "answer": [
        {
            "there_are_superheroes": "NO",
            "new_leaft": [
                {
                    "name": "Sheldon",
                    "superheroes": "NO"
                }
            ]
        }
    ]
}

如果可能的键列表是固定的,那就很简单了。否则用于Object.assign复制所有键(或仅遍历这些键),然后修改必要的键。

现在你必须弄清楚在哪里放置递归调用(提示:l.children.map(format),是否应该命名键tree或者new_leaf(t),检查该字段是否存在并相应地处理,(参见问题在 Javascript。我如何判断一个字段是否存在于对象? - 堆栈溢出)等。


推荐阅读