最短路径算法js报错
Shortest path algorithm js error
我是 JS 的新手,我的一个朋友发给我这个 fiddle
function shortestPath(g, s) {
g.vertexes.forEach(function(u) {
u.dist = Infinity;
u.prev = null;
});
s.dist = 0;
for (var i = 0; i < g.vertexes.length - 1; i++) {
g.edges.forEach(function(e) {
update(e);
});
}
printResult(); }
function update(e) {
var u = e.from;
var v = e.to;
if (v.dist > u.dist + e.data) {
v.dist = u.dist + e.data;
v.prev = u;
} }
var result = [];
function printResult() {
var str = '';
debugger;
for (var i = 0; i < result[0].length; i++) {
for (var j = 0; j < result.length; j++) {
str += result[i][j] + ' ';
}
console.log(str);
str = '';
} }
function printGraph(G) {
var a = [];
G.vertexes.forEach(function(u) {
a.push(u.dist);
});
result.push(a); }
function Graph(options) {
options = options || {};
this.directed = (options.directed != null) ? options.directed : true;
this.vertexes = [];
this.edges = []; }
Graph.prototype.vertex = function(name) {
var v = {
adjacent: [],
name: name.toString()
};
this.vertexes.push(v);
return this; };
Graph.prototype.get = function(name) {
return this.vertexes.filter(function(el) {
return el.name === name.toString();
})[0]; };
Graph.prototype.edge = function(a, b, w) {
var that = this;
connect(a, b, w);
if (!this.directed) {
connect(b, a, w);
}
function connect(a, b, data) {
var u = that.vertexes.filter(function(el) {
return el.name === a.toString();
})[0];
var v = that.vertexes.filter(function(el) {
return el.name === b.toString();
})[0];
u.adjacent.push(v);
that.edges.push({
from: u,
to: v,
data: data
});
}
return this; };
function main() {
var g = new Graph();
g.vertex(1)
.vertex(2)
.vertex(3)
.vertex(4)
.vertex(5)
.vertex(6)
.vertex(7)
.vertex(8);
g.edge(1, 2, -2);
g.edge(1, 5, -2);
g.edge(1, 6, -3);
g.edge(1, 8, -1);
g.edge(2, 6, 7);
g.edge(2, 8, 4);
g.edge(3, 2, 2);
g.edge(3, 4, 5);
g.edge(3, 7, 9);
g.edge(4, 7, 4);
g.edge(5, 7, 5);
g.edge(7, 8, -1);
g.edge(8, 2, 2);
g.edge(8, 5, 8);
g.edge(8, 6, 3);
g.edge(8, 7, 7);
shortestPath(g, g.get(3));
console.log(g); }
main();
(最短路径 Bellman-Ford)
并且不明白为什么它会在控制台中抛出错误 property 'length' of undefined
。
有什么建议可以解决这个错误吗?
一般来说,当 JS 报错 Cannot read property "xxx" of undefined
时,这意味着你在某处有 foo.xxx
和 foo
是 JavaScript 值 undefined
(这是不是对象,也没有属性)。
通过找到有问题的行(使用调试工具,或者甚至只是在您的情况下寻找 .length
)并考虑:问题变量何时可能是 undefined
来跟踪此类问题?
在您的具体情况下,错误发生在这一行:
for (var i = 0; i < result[0].length; i++) {
这意味着 result[0]
是 undefined
。这意味着您的 result
数组在 [0]
处没有值。它是空的。
因为 printResult
函数是从一个地方调用的(第 59 行),这可能意味着当 printResult()
被调用时 result
仍然是一个空数组。您可以通过在该位置设置断点并检查 result
是什么来确认这一点。
至于为什么是空的:
影响 result
数组的唯一代码是 printGraph()
函数中的 result.push(a)
。并且永远不会调用此函数。问问你的朋友,为什么 s/he 定义了 printGraph()
但从未调用它。
可能就像在 printResult()
之前调用 printGraph(g)
一样简单。
我是 JS 的新手,我的一个朋友发给我这个 fiddle
function shortestPath(g, s) {
g.vertexes.forEach(function(u) {
u.dist = Infinity;
u.prev = null;
});
s.dist = 0;
for (var i = 0; i < g.vertexes.length - 1; i++) {
g.edges.forEach(function(e) {
update(e);
});
}
printResult(); }
function update(e) {
var u = e.from;
var v = e.to;
if (v.dist > u.dist + e.data) {
v.dist = u.dist + e.data;
v.prev = u;
} }
var result = [];
function printResult() {
var str = '';
debugger;
for (var i = 0; i < result[0].length; i++) {
for (var j = 0; j < result.length; j++) {
str += result[i][j] + ' ';
}
console.log(str);
str = '';
} }
function printGraph(G) {
var a = [];
G.vertexes.forEach(function(u) {
a.push(u.dist);
});
result.push(a); }
function Graph(options) {
options = options || {};
this.directed = (options.directed != null) ? options.directed : true;
this.vertexes = [];
this.edges = []; }
Graph.prototype.vertex = function(name) {
var v = {
adjacent: [],
name: name.toString()
};
this.vertexes.push(v);
return this; };
Graph.prototype.get = function(name) {
return this.vertexes.filter(function(el) {
return el.name === name.toString();
})[0]; };
Graph.prototype.edge = function(a, b, w) {
var that = this;
connect(a, b, w);
if (!this.directed) {
connect(b, a, w);
}
function connect(a, b, data) {
var u = that.vertexes.filter(function(el) {
return el.name === a.toString();
})[0];
var v = that.vertexes.filter(function(el) {
return el.name === b.toString();
})[0];
u.adjacent.push(v);
that.edges.push({
from: u,
to: v,
data: data
});
}
return this; };
function main() {
var g = new Graph();
g.vertex(1)
.vertex(2)
.vertex(3)
.vertex(4)
.vertex(5)
.vertex(6)
.vertex(7)
.vertex(8);
g.edge(1, 2, -2);
g.edge(1, 5, -2);
g.edge(1, 6, -3);
g.edge(1, 8, -1);
g.edge(2, 6, 7);
g.edge(2, 8, 4);
g.edge(3, 2, 2);
g.edge(3, 4, 5);
g.edge(3, 7, 9);
g.edge(4, 7, 4);
g.edge(5, 7, 5);
g.edge(7, 8, -1);
g.edge(8, 2, 2);
g.edge(8, 5, 8);
g.edge(8, 6, 3);
g.edge(8, 7, 7);
shortestPath(g, g.get(3));
console.log(g); }
main();
(最短路径 Bellman-Ford)
并且不明白为什么它会在控制台中抛出错误 property 'length' of undefined
。
有什么建议可以解决这个错误吗?
一般来说,当 JS 报错 Cannot read property "xxx" of undefined
时,这意味着你在某处有 foo.xxx
和 foo
是 JavaScript 值 undefined
(这是不是对象,也没有属性)。
通过找到有问题的行(使用调试工具,或者甚至只是在您的情况下寻找 .length
)并考虑:问题变量何时可能是 undefined
来跟踪此类问题?
在您的具体情况下,错误发生在这一行:
for (var i = 0; i < result[0].length; i++) {
这意味着 result[0]
是 undefined
。这意味着您的 result
数组在 [0]
处没有值。它是空的。
因为 printResult
函数是从一个地方调用的(第 59 行),这可能意味着当 printResult()
被调用时 result
仍然是一个空数组。您可以通过在该位置设置断点并检查 result
是什么来确认这一点。
至于为什么是空的:
影响 result
数组的唯一代码是 printGraph()
函数中的 result.push(a)
。并且永远不会调用此函数。问问你的朋友,为什么 s/he 定义了 printGraph()
但从未调用它。
可能就像在 printResult()
之前调用 printGraph(g)
一样简单。