JavaScript 访问图中的每个节点
JavaScript visit every node in 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]);
应该是这样的
现在我要访问每个节点
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/
如果有人能提供帮助,那就太好了。
提前致谢
您的 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);
});
我认为将数据结构化为一个对象而不是一个包含子数组的数组会简化事情。
如果您的数据结构如下:
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 示例。
因此,我认为您真正需要解决的是构造函数的工作方式。祝你好运:)
我想创建一个图,其中每个节点都连接到它的子节点
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/
如果有人能提供帮助,那就太好了。 提前致谢
您的 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);
});
我认为将数据结构化为一个对象而不是一个包含子数组的数组会简化事情。
如果您的数据结构如下:
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 示例。
因此,我认为您真正需要解决的是构造函数的工作方式。祝你好运:)