最短路径算法js错误

时间:2016-05-09 20:22:49

标签: javascript json algorithm shortest-path bellman-ford

我是JS的新手,我的一个朋友给我发了这个小提琴

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();

(最短路径贝尔曼 - 福特) 并且没有真正理解为什么它会在控制台中抛出错误property 'length' of undefined

有关如何解决此错误的建议吗?

1 个答案:

答案 0 :(得分:0)

一般情况下,当JS抱怨Cannot read property "xxx" of undefined时,这意味着您拥有foo.xxxfoo的某个地方是JavaScript值undefined(这不是一个对象,并且没有属性)。

通过查找相关行(使用调试工具,甚至只是在您的案例中查找.length)并考虑:有问题的变量何时可以undefined来跟踪此类问题? / p>

在您的特定情况下,错误发生在此行:

for (var i = 0; i < result[0].length; i++) {

表示result[0]undefined。这意味着您的result数组在[0]处没有任何价值。它是空的。

由于printResult函数是从一个地方调用的(第59行),这可能意味着result在调用printResult()时仍然是一个空数组。您可以通过在该位置设置断点并检查result是什么来确认。

至于为什么它是空的:

影响result数组的唯一代码是result.push(a)函数中的printGraph()。从来没有调用过这个函数。问你的朋友为什么他/她定义printGraph()但从未调用它。

可能就像在printGraph(g)之前调用printResult()一样简单。