首页 > 解决方案 > 如何遍历 JSON 树

问题描述

请我想将下面的 JSON 转换为对象数组。我在递归方面很糟糕,我整天都在挣扎。请帮助将不胜感激。

{
  "org_name":"paradise island",
  "daughters" : [
    {
      "org_name": "banana tree",
      "daughters": [
        {"org_name":"Yellow Banana"},
        {"org_name":"Brown Banana"}
      ]
    },
    {
      "org_name": "big banana tree",
      "daughters": [
        {"org_name":"green banana"},
        {"org_name":"yellow banana"},
        {
          "org_name": "Black banana",
          "daughters": [
            {"org_name": "red spider"}
          ]
        }
      ]
    }
  ]
}

我希望它被转换如下:

[
  {id:1, name:'paradise island', parent: null},
  {id:2, name:'Banana Tree', parent: 1},
  {id:3, name:'yellow banana', parent: 2}
]

顺序无关紧要。重要的是根据父母与孩子的正确身份关系。我打算将 id 生成为 UUID。但是您可以随心所欲地生成它。

标签: javascriptjsontree

解决方案


看起来很简单,只需在函数之外为未使用的标识符声明一个变量,让函数将当前对象推送到数组,并在其每个子对象上调用该函数(如果它们存在):

const input={"org_name":"paradise island","daughters":[{"org_name":"banana tree","daughters":[{"org_name":"Yellow Banana"},{"org_name":"Brown Banana"}]},{"org_name":"big banana tree","daughters":[{"org_name":"green banana"},{"org_name":"yellow banana"},{"org_name":"Black banana","daughters":[{"org_name":"red spider"}]}]}]};

let nextUnusedId = 0;
const addToArr = ({ org_name: name, daughters }, parent = null, addTo = []) => {
  const id = nextUnusedId++;
  addTo.push({ id, name, parent });
  if (daughters) daughters.forEach(daughter => addToArr(daughter, id, addTo));
  return addTo;
};
console.log(
  addToArr(input)
);


推荐阅读