javascript - 使用数组值填充表
问题描述
我根据我正在关注的教程创建了一个反应测试游戏,但我想将其添加为练习,但我无法弄清楚如何用用户的前 10 个结果填充表格。我将结果存储在一个数组中。这个想法是用户将玩游戏,直到他们想要获得 10 个最好的分数,他们将按下按钮,表格将填充数组中的结果。表的最大大小为 10,但它的大小可以从 0 到 10,如果用户只玩 5 次,则表只会创建 5 行等。
该表将有 2 列,第 1 列用于订购第 1-10 列。第二是最好的时光。
<table id="resultsTable" border="1">
<tr>
<th>Position</th>
<th>Best time</th>
</tr>
</table>
我创建了数组来存储无序值。
var newArray = new Array();
单击形状后,我将结果推送到数组的末尾,我还添加了一个计数以跟踪有多少。
var count = 0;
// When the shape is clicked
document.getElementById("shape").onclick = function() {
document.getElementById("shape").style.display = "none";
//increments when user clicks the shapes
count++;
var end = new Date().getTime();
var timeTaken = (end -start)/1000;
document.getElementById("timeTaken").innerHTML = timeTaken + "s";
document.getElementById("clickNumber").innerHTML = count;
appearAfterDelay();
newArray.push(count, timeTaken);
}
按下按钮后,我创建一个 newArray 的克隆并对其进行排序,我想将无序数组分开。
var clone = newArray.slice(0);
//sorts the best times
clone.sort();
我正在尝试实现这个嵌套的 for 循环以将值显示到表中,但这是我卡住的地方。
var increment = 1; //Global variable
//once i is less than the count it keeps going. Because its sorted first best 10 will be at front, don't need to go any further.
for(var i = 0; i < count; i++){
var newRow = table.insertRow(count);
for(var j = 0; j < count; j++){
if (increment <= 10) {
var cell = newRow.insertCell(j);
cell.innerHTML = clone[i][j];
increment ++;
}else{
break;
}
}
}
}
我在下面附上了一个正在运行的代码的链接,任何帮助让它工作将非常感谢。
解决方案
为了解决这个问题,您需要做几件事。
首先,您尚未定义用于在结果表中插入行的变量。如果你像这样设置你的table
html:
<table id="resultsTable" border="1">
<thead>
<tr>
<th>Position</th>
<th>Best time</th>
</tr>
</thead>
<tbody id="results">
</tbody>
</table>
然后您可以tbody
像这样选择部分(要在表格标题下方显示结果的位置):
var results = document.getElementById('results');
然后,有多种方法可以显示您正在寻找的结果,但这里有一种通常与您尝试执行的操作一致。您误解了如何insertRow
工作insertCell
,下面的代码示例只是使用-1
索引在末尾插入行和单元格。此外,您的clone
数组不是数组数组,因此您无法使用您正在使用的语法访问值,并且嵌套循环确实没有理由。消除了对increment
变量的使用,因为您可以在显示 10 个结果后使用迭代器来中断循环。还添加了results.innerHTML = ''
在循环之前清除结果,然后在后续点击中显示新的(可能不同的)前 10 次(有更好的方法来删除 html,但希望下面的代码示例专注于大多数问题所在的循环)。
results.innerHTML = '';
for(var i = 0; i < count; i++){
var newRow = results.insertRow(-1);
var cell1 = newRow.insertCell(-1);
var cell2 = newRow.insertCell(-1);
cell1.innerHTML = i + 1;
cell2.innerHTML = clone[i];
if (i === 9) {
break;
}
}
通过上述更改,您不需要包含您的count
值,newArray
因为它会使您的结果因错误数据而变得混乱。所以newArray.push(count, timeTaken)
改为newArray.push(timeTaken)
.
此外,js sort 函数默认将数组值作为字符串进行比较。要比较数值,您需要将函数传递给sort
,例如clone.sort(function(a,b) {return a - b;})
按升序对值进行排序。
最后,它可能会帮助您将 js 粘贴到像jshint这样的验证器中,因为根据我的快速扫描,我认为您的代码笔中可能还有一两个错误(检查不会有坏处)。
推荐阅读
- c# - RegisterInstance 方法和 InstancePerDependency 生命周期范围不一致
- python - 检测 Pandas 数据框所有列的异常值
- swift - 尝试更新 cocoapods 时出现权限错误
- c - 使用 C 中的运算符从无符号整数中获取 6 个最高有效位的最佳方法?
- go - 使用兼容接口进行恐慌接口转换
- node.js - 尝试从位置 17 的日期时间读取日期时间抛出错误
- c - 如何使用 C 中的 write() 函数将浮点数转换为字符串以打印它
- python - 在 Pandas Dataframe 中合并 2 列数据
- machine-learning - 如果不是为了提高速度,那么减少 FLOP 和参数大小的目的是什么?
- reactjs - 我需要在我的项目中调整图像的大小 react + gatsby