2016-05-09 15 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

問題を再現するのに必要な完全なコードが含まれていないため、私はあなたの質問をd​​ownvotedしました。コードの_sole_場所として外部サイト(JSFiddleなど)に依存しないでください。それらのサイトがダウンした場合、あなたの質問はむしろ無駄になります。あなたの問題を再現するために必要なすべてのコードを含めるように質問を編集する場合、私は喜んでdownvoteを削除します。 – Phrogz

+0

指摘していただきありがとうございました、これについて、Stackoverflowにもnoob知らなかった。 – 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関数が1つの場所(行59)から呼び出されているため、printResult()が呼び出されたときにresultがまだ空の配列である可能性があります。その場所でブレークポイントを設定し、resultが何であるかを調べることで、これを確認できます。それが空である理由としては

resultアレイprintGraph()関数であるresult.push(a)影響コードのみ。そしてこの関数は決して呼び出されません。 s/heがprintGraph()を定義した理由をあなたの友人に尋ねるが、決して呼び出さなかった。

printGraph(g)printResult()の直前に呼び出すのと同じくらい簡単かもしれません。

+0

これは今動作します、ステップバイステップで説明してくれてありがとう! – Wasea

+0

ようこそ。この回答が問題を完全に解決した場合は、チェックマークをクリックしてこの回答に「受け入れ」と記入していただければ幸いです。 – Phrogz

関連する問題