2017-11-03 7 views
-2

に適切な値を取得できません。クエリに問題はないようですが、forループは上記の適切な値を取得しません。どのように私はは私がデータベースを照会し、動的テーブルを埋めるために、結果を使用し以下のコードで少し問題を抱えているnodejs

//grab result from doneon table and show on report 
    connection.query('SELECT * FROM doneon WHERE SampID LIKE ?', id, (err, rows, fields) => { 
    if(err){ 
     return console.log('An error ocurred with the query', err) 
    } 
    var tabldiv = document.getElementById('tabldivid') 
    var table = document.createElement('TABLE') 
    var tableBody = document.createElement('TBODY') 

    // table.style.border = '3px solid black' 
    table.style.width = '100%' 
    table.id = 'tablid' 
    table.appendChild(tableBody); 

    var heading = new Array(); 
    heading[0] = "Test" 
    heading[1] = "Result" 
    heading[2] = "Normal values" 

    for(i=0; i <rows.length; i += 1) { 
     var resu = new Array() 
     resu[i] = rows[i] 
     console.log(rows[i]); 
    } 

    //TABLE COLUMNS 
    var tr = document.createElement('TR'); 
    tableBody.appendChild(tr); 
    for (i = 0; i < heading.length; i++) { 
     var th = document.createElement('TH') 
     th.width = '75'; 
     th.appendChild(document.createTextNode(heading[i])); 
     tr.appendChild(th); 
    } 

    //TABLE ROWS 
    for (i = 0; i < resu.length; i++) { 
     var tr = document.createElement('TR'); 
     for (j = 0; j < resu[i].length; j++) { 
      var td = document.createElement('TD') 
      td.appendChild(document.createTextNode(resu[i][j])); 
      tr.appendChild(td) 
     } 
     tableBody.appendChild(tr); 
    } 
    tabldiv.appendChild(table) 
    }) 
+0

'console.log(rows [i]);'? – Ben

+0

最初のforループの各繰り返しで変数 'resu'を' new Array'として定義しています。この新しい配列のi番目の要素には、ほとんどの場合未定義の値を含む配列を生成する行配列の値が割り当てられます。 https://javascript.info/arrayは、最小、完全、および検証可能なサンプル(https://stackoverflow.com/help/mcve) – John

+0

Hello Benのコンソールを提供するポイントに役立ちます。log(rows [i])は私にrowdatapacketを与えます。なぜそれがUncaught TypeErrorと言うのか分かりません:未定義のプロパティ 'length'を読み取ることができません。私がconsole.log(rows.length)を実行すると、それは私に値を与えます – robikube

答えて

0

ジョンはあなたが新しいresu配列にforループの繰り返しのたびに初期化されていることを正しいことを修正することができます。新しいresu配列ごとに反復を初期化することで、あなただけの、次の反復で、resuのi番目のインデックスを移入され、resu変数は再び再初期化されます、そして、古いデータがresuを移入することは上書きされたこと。これは電流i番目のインデックスを除き、未定義としてresuすべてインデックスを残します。

rows = ['a', 'b', 'c', 'd', 'e', 'f']; 

これは、各ループにresuのデータに何が起こっているのか(未定義のインデックスは繰り返しで始まる注意:たとえば

、のは、あなたのSQLクエリの結果は、私たちに次のようrows配列を与えるとしましょう2):

反復1:resu = ['a'];

反復2:resu = [,'b'];

イテレーション3:resu = [,,'c'];

反復4:resu = [,,,'d'];

...というように。 0番目のインデックスのforループをresuに実行すると、0番目のインデックスは未定義です。あなたがループの3日に未定義のエラーを取得する理由はここにありますが、resu.lengthrows.length

をconsole.loggingときあなたはまだ結果を得るしかし、あなたはまったく別のresu配列を必要とする場合、私は実際には思ったんだけど。

for (i = 0; i < rows.length; i++) { 
    ...... 
    for (j = 0; j < rows[i].length; j++) { 
     ...... 
    } 
} 

この方法で、あなたが完全にループのためのあなたの最初のを省略することができます。私は、あなたは、単にテーブルの行を作成するためにrows配列を反復から同じ結果になるだろうと信じています。あなたには、いくつかの理由でrows配列の重複を必要がある場合、あなたはまだループのために省略することができ、その代わりに、あなたはそれをこのように初期化する必要があります。

var resu = rows; 

これはまだ、重複配列を作るだろうが、それはあなたの実行時間を短縮しますあなたが不必要に配列を反復処理しているわけではないからです。

+0

ヘイロバート、ありがとう。私は単純なルートを取って終わり、JavaScriptを使ってHTMLに値を直接書き込んでテーブルを作成しました。シンプルで今のところやります。 – robikube

関連する問題