你好,我有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);
我的函数返回多个数组中的输出,所以我不知道该如何操作以返回这样的输出。将不胜感激。谢谢!
答案 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
或其他名称?