2016-05-09 78 views
1

我很新進JS和我的一個朋友給我發了這個小提琴最短路徑算法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在控制檯。

任何意見如何解決這個錯誤?

+0

我已經低估了你的問題,因爲你沒有包含重現問題所需的完整代碼。請不要依賴外部網站(如JSFiddle)作爲代碼的_sole_位置;如果這些網站出現故障,你的問題就變得毫無用處。如果您編輯問題以包含重現問題所需的所有代碼,我將很樂意刪除downvote。 – Phrogz

+0

謝謝指出,不知道這個,noob to Stackoverflow也。 – Wasea

+0

我對代碼進行了格式化,但顯然您同時編輯了該問題,並且我的編輯被丟棄;無論如何,看看這個:http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks/22189#22189 – m69

回答

0

一般來說,當JS抱怨Cannot read property "xxx" of undefined,這意味着你有foo.xxxfoo的地方是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)唯一代碼。而這個功能從來沒有被調用過。詢問你的朋友爲什麼他/她定義printGraph()但從未調用它。

它可能就像在printResult()之前調用printGraph(g)一樣簡單。

+0

它現在的作品,謝謝你一步一步解釋! – Wasea

+0

不客氣。請注意,如果這個答案已經完全解決了你的問題,如果你通過點擊複選標記來標記這個答案是「被接受」,那將不勝感激。 – Phrogz