我希望有一个树结构,其中每个节点都可以引用其父节点,如下所示:
class Tree {
constructor(name, parent = null) {
this.name = name;
this.children = [];
this.parent = parent;
}
appendChild(name) {
this.children.push(new Tree(name, this));
}
}
let myTree = new Tree("Sarah");
myTree.appendChild("Laura");
问题是这样的结构不可能用JSON来表示,因为它是循环的:Sarah包含对她的孩子Laura的引用,其中包含对她的父母Sarah的引用,其中包含对她的孩子Laura的引用,等等。
我真正喜欢的是,孩子只需要将指针添加到其父级,而不会将其评估为完整的父级。但我不认为这是可能的。那我该怎么办?
答案 0 :(得分:0)
添加一个自定义 toJSON 方法,该方法将对字符串的引用解析为id,然后添加另一个与之相反的 fromJSON 方法,例如:
Tree.toJSON=function(tree,i=0){
tree.lookup=i;
tree.children.forEach(function(child){
child.parent=i;
Tree.toJSON(child,++this.i);
},{i});
if(!i) return JSON.stringify(tree);
}
Tree.fromJSON=function(tree,lookup=new Map()){
if(typeof tree==="string") tree=JSON.parse(tree);
lookup.set(tree.lookup,tree);
tree.children.forEach(function(child){
child.parent=lookup.get(child.parent);
Tree.fromJSON(child,lookup);
});
return tree;
}
但如果只是谈论父引用,可能更容易简单地删除它,并在以后添加它:
//toJSON
tree.children.forEach(function(child){
delete child.parent;
});
//fromJSON
tree.children.forEach(function(child){
child.parent=tree;
});