【问题标题】:How to traversing a JSON tree如何遍历 JSON 树
【发布时间】:2018-11-21 07:16:21
【问题描述】:

我想将下面的 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。但你可以随心所欲地生成它。

【问题讨论】:

  • 这应该会有所帮助:stackoverflow.com/questions/11922383/…
  • 当你说你希望它被转换时,你想要一些代码来完成它,还是你想要你给我们的 JSON 像底部的那样格式化?
  • 向我们展示您的尝试!
  • 对不起,伙计们。这是我尝试过的...const uuidv4 = require('uuid/v4'); function serialize(payload) { return (function traverse(res, payload, parent) { var row = {}, uuid = '', prop; for(prop in payload) { uuid = uuidv4() if(typeof payload[prop] === 'Array') { traverse(res, payload[prop], uuid) } else { row.id = uuid row.name = payload[prop] row.parent = parent res.push(row); } } return res })(res = [], payload, parent = 'null') }我可能会错过什么

标签: javascript json tree


【解决方案1】:

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

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)
);

【讨论】:

  • hmnnn...我想我只是想太多了...我会试试这个
【解决方案2】:

感谢@CertainPerformance。这是我的最终解决方案

const uuidv4 = require('uuid/v4');

function serialize(payload) {

	return (function traverse(res, payload, parent) {

		var row = {}, uuid = '', prop;

		uuid = uuidv4()
		row.id = uuid
		row.name = payload["org_name"]
		row.parent = parent
		res.push(row);

		if(payload.hasOwnProperty('daughters')){
			payload["daughters"].forEach(function(daughter) {
				traverse(res, daughter, uuid)
			})
		}

		return res

	})(res = [], payload, parent = 'null')
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多