JS树节点如何保留对其父节点的引用而不变为循环?

时间:2017-07-28 09:08:08

标签: javascript json

我希望有一个树结构,其中每个节点都可以引用其父节点,如下所示:

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的引用,等等。

我真正喜欢的是,孩子只需要将指针添加到其父级,而不会将其评估为完整的父级。但我不认为这是可能的。那我该怎么办?

1 个答案:

答案 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;
});