Рекурсивно создавать строки из объектов - PullRequest
0 голосов
/ 30 октября 2018

Здравствуйте, у меня есть файл json:

var jsonData = {
  "name": "James",
  "age": 22,
  "nodes": [
    {
      "name": "John",
      "age": 24,
      "nodes": [
        {
          "name": "Jack",
          "age": 65,
          "nodes": [
            {
              "name": "Harry",
              "age": 70,
              "nodes": []
            }
          ]
        },
        {
          "name": "Joe",
          "age": 10,
          "nodes": []
        }
      ]
    },
    {
      "name": "Daniel",
      "age": 30,
      "nodes": []
    }
  ]
}

Мне нужна функция, которая возвращает вывод следующим образом:

James 22
James - John 24
James - John - Jack 65
James - John - Jack - Harry 70
James - John - Joe 10
James - Daniel 30

Я пытался использовать рекурсивную функцию, но я не знаю, как вернуть вывод, подобный этому, и вернуть возраст только для последнего ребенка.

Код:

var json = jsonData;
var prev = [];

function sortData(obj, prev) {
  var i = 0;
  prev.push(obj.name + " " + obj.age);
  console.log(prev);
  if (obj.nodes.length > 0) {
    while (i < obj.nodes.length) {
      sortData(obj.nodes[i], prev);
      i++;
      prev.pop();
    }
  }
}

sortData(json, prev);

Моя функция возвращает вывод в нескольких массивах, поэтому я не знаю, как с этим работать, чтобы возвращать вывод, подобный этому. Буду благодарен за любую помощь. Спасибо!

1 Ответ

0 голосов
/ 30 октября 2018

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

var jsonData={"name":"James","age":22,"nodes":[{"name":"John","age":24,"nodes":[{"name":"Jack","age":65,"nodes":[{"name":"Harry","age":70,"nodes":[]}]},{"name":"Joe","age":10,"nodes":[]}]},{"name":"Daniel","age":30,"nodes":[]}]}

function getAge({ name, age, nodes }, oldPropStr = '') {
  const propStr = (oldPropStr ? oldPropStr + ' - ' : '') + name;
  console.log(propStr + ' ' + age);
  nodes.forEach(node => getAge(node, propStr));
}
getAge(jsonData);

Также вы можете заметить, что текущее имя переменной jsonData вводит в заблуждение. Не существует такого понятия, как "объект JSON" . Если у вас есть объект или массив, то у вас есть объект или массив, полная остановка. Формат JSON - это метод представления объекта в строке , например const myJSON = '{"foo":"bar"}'. Если не задействованы строки, сериализация или десериализация, JSON также не будет задействован. Может быть, вызвать переменную people или что-то вместо этого?

...