【问题标题】:Recursive Javascript: child->parent relationship递归Javascript:子->父关系
【发布时间】:2014-01-22 03:26:29
【问题描述】:

我正在尝试遍历一系列父->子关系,直到我们到达一个没有自己的父级的父级。如果孩子有父母,那么我们将该父母对象与该父母的任何父母一起存储在数组中。如果父级没有父级,我们存储一个空数组。

这是一些显示我想要的数据结构的伪 JSON。

Node3 = { // Node 3
   parent: { // Node 2
      parent: { // Node 1
         parent: null,
         parentTree: []
      },
      parentTree: [Node1]
   },
   parentTree: [Node2, Node1]
}

到此为止的构造函数和递归方法……

function Node(parent) {
    this.parent = typeof parent !== 'undefined' ? parent : null;
}

Node.prototype.getParentTree = function() {
    if(typeof this.parentTree === "undefined") {
        if (this.parent !== null) {
            this.parentTree = this.parent.getParentTree();
            this.parentTree.push(this.parent);
        } else {
            this.parentTree = [];
        }
    }
    return this.parentTree;
}

这是我测试该方法的方式:

var node1 = new Node();
var node2 = new Node(node1);
var node3 = new Node(node2);

node3.getParentTree();

当前方法的问题在于 node1、node2 和 node3 的 parentTree 的长度都 === 2。当您检查 parentTree 中的对象时,它们包含无穷大的子对象对。

【问题讨论】:

    标签: javascript recursion


    【解决方案1】:
    this.parentTree = this.parent.getParentTree();
    this.parentTree.push(this.parent);
    

    这样,父节点和子节点的 parentTree 都指向同一个 Array 对象 - 因此您也将新节点附加到父节点的树中。

    使用slice创建数组的副本:

    return this.parentTree.slice(); // every time the getter is called
    

    或

    this.parentTree = this.parent.getParentTree().slice(); // only for manipulating
    

    【讨论】:

    • 工作得很好,我现在知道我的问题出在哪里了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多