JavaScript访问图形中的每个节点
我想创建一个图,其中每个节点都连接到其子节点JavaScript访问图形中的每个节点,javascript,graph,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[
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]);
}
功能访问(节点){
node.mark=true;
对于(i=0;i您的i
具有全局范围
因此子数组上的迭代使用相同的i
,并且相互干扰
通过添加var
使其成为局部变量
for (var i=0; i<node.childs.length; i++)
if (!node.childs[i].mark)
visit (node.childs[i]);
我认为将数据结构化为一个对象而不是一个带有子数组的数组可以简化事情
如果您按照以下方式构建数据:
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);
然后,您可以更轻松地访问每个节点,如下所示:
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);
例如
因此,我认为,您真正需要解决的是构造函数的工作方式。祝您好运:)此结构不提供图形,只提供树