我是一个javascript新手。我的数独游戏有一个9*9
网格。 html是这样的,网格的每个框都是input
元素,其ID为r1c4
,其中1
是行数字,4
是列号码。我有一半填充网格。我需要将所有数字存储在网格中two
维array
。我创建了以下函数:
function getValues(){
var grid = new Array();
var colData = new Array();
var targetId;
for(var i=1;i<=9;i++)
{
for(var j=1;j<=9;j++)
{
targetId = 'r' + i + 'c' + j;
colData[j-1] = document.querySelector('#'+targetId).value;
}
grid[i-1] = colData;
console.log(grid[i-1]); // here logged correctly
}
return grid; // here returned wrong
}
我面临的问题是返回的数组只包含重复9次的最后一个元素。我每次使用console.log(grid[i-1]);
记录存储的值并且它给出了正确的结果。我没有得到它。
问候。
答案 0 :(得分:2)
grid[i-1] = colData;
您不是要将colData
复制到grid[i-1]
,而只是将grid[i-1]
简称为colData
。因此,数组中的所有元素都只是对同一对象colData
。
要解决此问题,您需要在每次迭代时创建一个新数组。所以,我会这样做
function getValues() {
var grid = [], colData, targetId;
for (var i = 1; i <= 9; i++) {
colData = []; // new Array on every iteration
for (var j = 1; j <= 9; j++) {
targetId = 'r' + i + 'c' + j;
colData.push(document.querySelector('#' + targetId).value);
}
grid.push(colData);
}
return grid;
}
答案 1 :(得分:2)
您需要每次迭代创建一个新的colData
,而不是每次都使用相同的。{/ p>
for(var i=1;i<=9;i++)
{
var colData = new Array();
...
答案 2 :(得分:2)
尝试在colData = new Array()
圈内移动colData = [];
(或更好,i
)。
或使用grid[i-1] = colData.slice(0);
。
无论哪种方式,您都需要为每一行创建一个新数组,而不仅仅是重新使用旧数组。
答案 3 :(得分:2)
您为每一列使用相同的 Array对象,只是覆盖了这些值。您将对同一数组的9个引用推送到网格中。
您需要在循环中移动var colData = new Array();
,以便为每列创建 new 数组。