2016-05-09 10 views
1

Ich bin ganz neu in JS und ein Freund von mir schickte mir diese GeigeShortest Path Algorithmus js Fehler

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

(Kürzester Weg Bellman-Ford) und haben es wirklich nicht bekommen, warum es den Fehler wirft property 'length' of undefined in der Konsole.

Irgendwelche Ratschläge, wie man diesen Fehler behebt?

+0

Ich habe Ihre Frage abgelehnt, weil Sie nicht den vollständigen Code enthalten haben, der zur Reproduktion des Problems benötigt wird. Bitte verlassen Sie sich nicht auf externe Sites (wie JSFiddle) als den Speicherort _sole_ für Code; Wenn diese Seiten ausfallen, wird Ihre Frage eher nutzlos. Wenn Sie Ihre Frage so bearbeiten, dass sie den gesamten Code enthält, der für die Reproduktion Ihres Problems erforderlich ist, entferne ich gerne den Downvote. – Phrogz

+0

Danke für das Aufzeigen, wusste nicht darüber, auch nicht zu Stackoverflow. – Wasea

+0

Ich habe Ihren Code formatiert, aber anscheinend haben Sie die Frage gleichzeitig bearbeitet, und meine Änderungen wurden verworfen. Wie auch immer, sieh dir das an: http://meta.stackexchange.com/questions/22186/how-doi-i-format-my-code-blocks/22189#22189 – m69

Antwort

0

Im Allgemeinen, wenn JS Cannot read property "xxx" of undefined beschwert, das bedeutet, dass irgendwo haben Sie foo.xxx und foo der Wert JavaScript ist undefined (das nicht ein Objekt ist, und hat keine Eigenschaften).

Verfolgen Sie ein solches Problem, indem Sie die fragliche Zeile finden (mit Debugging-Tools, oder einfach nur nach .length in Ihrem Fall suchen) und in Erwägung ziehen: Wann könnte die betreffende Variable undefined sein?

In Ihrem speziellen Fall, tritt der Fehler auf dieser Linie:

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

was bedeutet, dass result[0]undefined ist. Das bedeutet, dass Ihr result Array keinen Wert bei [0] hat. Es ist leer.

Da die printResult Funktion von einer Stelle (Zeile 59) aufgerufen wird, bedeutet dies wahrscheinlich, dass result immer noch ein leeres Array ist, wenn printResult() aufgerufen wird. Sie können dies bestätigen, indem Sie an dieser Stelle einen Haltepunkt setzen und untersuchen, was result ist.

Was, warum es leer ist:

Der einzige Code, der die result Array wirkt result.push(a) in der printGraph() Funktion ist. Und diese Funktion wird nie aufgerufen. Fragen Sie Ihren Freund, warum er printGraph() definiert hat, aber nie aufgerufen hat.

Es kann so einfach sein wie printGraph(g) kurz vor printResult() aufrufen.

+0

es funktioniert jetzt, danke für die Erklärung Schritt für Schritt! – Wasea

+0

Gern geschehen. Bitte beachten Sie, dass, wenn diese Antwort Ihr Problem vollständig gelöst hat, es wünschenswert wäre, wenn Sie diese Antwort als "akzeptiert" markieren würden, indem Sie auf das Häkchen klicken. – Phrogz