没有在javascript中获得函数的预期返回值

时间:2014-04-09 15:13:18

标签: javascript

我是一个javascript新手。我的数独游戏有一个9*9网格。 html是这样的,网格的每个框都是input元素,其ID为r1c4,其中1数字,4号码。我有一半填充网格。我需要将所有数字存储在网格中twoarray。我创建了以下函数:

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]);记录存储的值并且它给出了正确的结果。我没有得到它。

问候。

4 个答案:

答案 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 数组。