我一直在努力根据我在这里获得的帮助制作一个递归函数:looping through an object (tree) recursively
我想要浏览对象o并创建一个键在每个键上的新对象,并且对于它上面的所有内容都有父值。
我的大脑不会很好地递归,对它进行一次破解:-) ..如果你想尝试使用真实的数据here
function eachRecursive(obj) {
for (var k in obj) {
if (typeof obj[k] == "object" && obj[k] !== null ) {
eachRecursive(obj[k])
}
else {
// do something to add to codes
}
}
}
var o = {
"1": {
name: "hi 1",
children: {
"1.1": {
name: "hi 1.1",
children: {
"1.1.1": {
name: "hi 1.1.1",
children: {}
}
}
},
"1.2": {
name: "hi 1.2",
children: {}
}
}
},
"2": {
name: "hi 2",
children: {
"2.1": {
name: "hi 2.1",
children: {}
}
}
}
}
var codes = {}
eachRecursive(o)
console.log(codes)
// What I wish to have.
//{
// "1": {
// "name":"hi 1",
// "parents":[]
// },
// "2": {
// "name": "hi 2",
// "parents": []
// },
// "1.1": {
// "name": "hi 1.1",
// "parents": ["1"]
// },
// "1.1.1": {
// "name": "hi 1.1.1",
// "parents": ["1", "1.1"]
// },
// "1.2": {
// "name": "hi 1.2",
// "parents": ["1"]
// },
// "2.1": {
// "name": "hi 2.1",
// "parents": ["2"]
// }
//}
答案 0 :(得分:1)
你可以这样做:
function eachRecursive(obj) {
return (function recurse(result, obj, parents) {
for (var key in obj || {}) {
result[key] = { name: obj[key].name, parents: [...parents] };
recurse(result, obj[key].children, parents.concat(key));
}
return result;
})({}, obj, []);
}
var o = {
"1": {
name: "hi 1",
children: {
"1.1": {
name: "hi 1.1",
children: {
"1.1.1": {
name: "hi 1.1.1",
children: {}
}
}
},
"1.2": {
name: "hi 1.2",
children: {}
}
}
},
"2": {
name: "hi 2",
children: {
"2.1": {
name: "hi 2.1",
children: {}
}
}
}
}
var codes = eachRecursive(o);
console.log(codes);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)
你必须一步一步地思考如何手工完成。
如果它是一个对象:将实际节点添加到结果中,然后使用扩展父节点和结果再次调用该函数。
如果它不是对象:只需将其附加到结果中。
我在这里为你创造了一个小提琴:https://jsfiddle.net/11e8e4af/
function eachRecursive(obj) {
var parents = arguments[1] || [];
var result = arguments[2] || {};
for (var k in obj) {
if (obj.hasOwnProperty(k) && typeof obj[k] == "object" && obj[k] !== null ) {
result[k] = {name:obj[k].name, parents:parents.slice()};
eachRecursive(obj[k].children, parents.concat(k), result);
} else {
result[k] = {name:obj[k].name, parents:parents.slice()};
}
}
return result;
}