在我正在使用的树对象中,一个节点可能具有'children'属性,该属性可以包含一系列子节点。这是多层菜单结构的概念。
我想要实现的是在子代中动态添加对父代的引用。
我被困在应该改变原始对象的位置。我不知道该怎么做。
代码段以示例对象开头。它后面是一个递归函数,该函数访问每个节点并保留对父节点的引用,但不修改对象。然后有一个功能可以修改对象,但只能修改3个深度。
var obj = {
id: "a",
children: [{
id: "b",
children: [{
id: "c"
}]
},
{
id: "d"
}
]
};
function visitNode(node, parent) {
if (node.children) {
console.log('node with children', node, 'parent\'s ID is:', parent.id);
node.children.forEach(child => visitNode(child, node));
} else {
console.log('node with no children:', node, 'parent\'s ID is:', parent.id);
}
}
visitNode(obj, {id: null});
function mutate(obj) {
obj.parentId = null;
if (obj.children) {
obj.children.forEach((child, i) => {
obj.children[i].parentId = obj.id;
if (child.children) {
child.children.forEach((child2, j) => {
obj.children[i].children[j].parentId = obj.children[i].id;
})
}
})
}
}
mutate(obj);
console.log('mutated object', obj);
最佳答案
您可以使用与实际对象和父引用一起调用的递归函数。如果存在子代,则对子代进行迭代,并使用实际引用再次调用该函数。
该建议创建对该对象的循环引用(这意味着JSON.stringify
可能不起作用)。
function setParent(object, parent) {
object.parent = parent;
object.children && object.children.forEach(function (o) {
setParent(o, object);
});
}
var object = { id: "a", children: [{ id: "b", children: [{ id: "c" }] }, { id: "d" }] };
setParent(object);
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }