我在下面的代码中遇到一些问题,我查询数据库并使用结果来填充动态表。查询似乎没有问题,但for循环没有从上面获取适当的值。我怎么能解决这个问题
//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 :(得分:0)
John在每次迭代for循环时初始化一个新的resu
数组是正确的。通过在每次迭代时初始化一个新的resu
数组,您只填充resu
的第i个索引,然后在下一次迭代中,resu
变量再次重新初始化,并且旧数据填充resu
的 被覆盖。这会将resu
中的所有索引保留为未定义,但当前的第i个索引。
例如,让我们说SQL查询的结果为我们提供了以下rows
数组:
rows = ['a', 'b', 'c', 'd', 'e', 'f'];
这是每个循环中resu
中的数据发生的事情(注意从迭代2开始的未定义索引):
迭代1: resu = ['a'];
迭代2: resu = [,'b'];
迭代3: resu = [,,'c'];
迭代4: resu = [,,,'d'];
......等等。然后,当您在resu
上的第0个索引上运行for循环时,第0个索引未定义。这就是为什么你在3th for循环中得到一个未定义的错误,但是当console.logging resu.length
和rows.length
但我真的想知道你是否需要一个单独的resu
数组。我相信只需遍历rows
数组就可以得到相同的结果来创建表行:
for (i = 0; i < rows.length; i++) {
......
for (j = 0; j < rows[i].length; j++) {
......
}
}
这样你就可以完全省略你的第一个for循环。如果由于某种原因确实需要重复rows
数组,你仍然可以省略for循环,而应该用这种方式初始化它:
var resu = rows;
这仍然会产生一个重复的数组,但它会减少你的运行时间,因为你不会不必要地迭代一个数组。