我想创建一个图表,其中每个节点都连接到其子节点
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]);
应该是这样的
现在我想访问每个节点
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提前
答案 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示例。
因此,我认为你真正需要解决的是构造函数的工作原理。祝你好运:)