Как пройти по дереву JSON - PullRequest
0 голосов
/ 12 июня 2018

Пожалуйста, я хочу преобразовать 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}
]

Порядок не имеет значения.Что важно, так это правильное отношение идентификатора в соответствии с родителем и ребенкомЯ намерен создать идентификатор как UUID.Но вы можете генерировать его как угодно.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Благодаря @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')
}
0 голосов
/ 12 июня 2018

Кажется довольно простым, просто объявите переменную для неиспользуемого идентификатора вне функции, сделайте так, чтобы функция передавала текущий объект в массив, и вызывайте функцию для каждой из ее дочерних объектов, если они существуют:

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)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...