从对象递归创建字符串

时间:2018-10-29 22:53:55

标签: javascript arrays sorting multidimensional-array nested

你好,我有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 :(得分:0)

您可能会考虑仅递归地传递表示当前属性路径的字符串,这样,您可以串联并传递值,而不必担心其被突变。此外,使用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的当前变量名具有误导性。 There's no such thing as a "JSON Object"。如果您有一个对象或数组,那么您有一个对象或数组,句号。 JSON格式是一种用字符串表示对象的方法 ,例如const myJSON = '{"foo":"bar"}'。如果不涉及任何字符串,序列化或反序列化,那么JSON也将不涉及。也许叫变量people或其他名称?