JavaScript访问图中的每个节点

时间:2015-02-08 02:43:09

标签: javascript graph

我想创建一个图表,其中每个节点都连接到其子节点

function Node (value) {
    this.value = value;
    this.childs = [];
    this.mark = false;
}

这是我的图表

var nodes = [new Node (0), new Node (1), new Node (2), new Node (3), new Node (4)];

nodes[0].childs.push (nodes[1]);
nodes[1].childs.push (nodes[0]);

nodes[1].childs.push (nodes[2]);
nodes[2].childs.push (nodes[1]);

nodes[1].childs.push (nodes[4]);
nodes[4].childs.push (nodes[1]);

nodes[2].childs.push (nodes[3]);
nodes[3].childs.push (nodes[2]);

应该是这样的

graph

现在我想访问每个节点

function visit (node) {
    node.mark = true;
    for (i=0; i<node.childs.length; i++)
        if (!node.childs[i].mark)
            visit (node.childs[i]);
}

但节点4永远不会被访问我不会解决的问题。 请参阅操作:http://jsfiddle.net/jhdLhz44/

如果有人可以提供帮助,那会很好。 Thx提前

2 个答案:

答案 0 :(得分:1)

您的i具有全球范围。

因此,子数组上的迭代使用相同的i并相互干扰。

通过添加var将其设为局部变量。

for (var i=0; i<node.childs.length; i++)
    if (!node.childs[i].mark)
        visit (node.childs[i]);

仅供参考,一个更漂亮且不易出错的方法是使用Array.prototype.forEach

node.childs.forEach(function(child) {
    if (!child.mark)
        visit (child);
});

答案 1 :(得分:0)

我认为将数据结构化为对象而不是具有子数组的数组会简化事情。

如果您按照以下方式构建数据:

var nodes = {
    "0": {
        mark: false,
        "1": {
            mark: false,
            "2": {
                "3": {
                    mark: false
                }
            },
            "4": {
                mark: false
            }
        }
    }
}

然后,您可以更轻松地访问每个节点:

(function visit(obj) {
    obj.mark = true;
    for (var key in obj) {
        if (typeof obj[key] === 'object') {
            visit(obj[key]);
        }
    }
})(nodes);

JSFiddle示例。

因此,我认为你真正需要解决的是构造函数的工作原理。祝你好运:)