使用默认值

时间:2015-06-29 20:18:09

标签: javascript arrays multidimensional-array

以下代码工作正常但我被要求在以下代码中找到错误。任何人都可以指出。

function defaultMatrix(size) { 
    var defaultValue = 0;
    var row = [];
    var matrix = [];
    for (var i=0; i < size; i++) { row.push(defaultValue); }
    for (var i=0; i < size; i++) { matrix.push(row); }
    return matrix;
}

console.log(defaultMatrix(6));

2 个答案:

答案 0 :(得分:0)

我认为JS中的错误是数组引用的对象。因此,在您的情况下,您只创建一次矩阵。然后你将它推入行中。

因此,在这种情况下,如果您执行的代码如下:

let arr = defaultMatrix(2);
arr[0][0] = 1;

显示arr [1] [0]和arr [2] [0],值为&#34; 1&#34;因为所有arr [n]上的数组都是相同的。

要解决此问题,您必须在每一行中创建一个新数组。要解决您的代码,您只需要更改1行:

for (var i=0; i < size; i++) { matrix.push(row.slice()); }

slice创建当前数组的副本。

但是您可以在一行中完成所有操作,例如:

function defaultMatrix(size, defaultValue = 0) { 
    return Array(size).fill(0).map(() => {return Array(size).fill(defaultValue)});
}

答案 1 :(得分:-1)

您正在添加相同行的大小倍,最终大小*大小。

function defaultMatrix(size) { 
    var defaultValue = 0;
    var rows = [];
    var matrix = [];
    for (var i=0; i < size; i++) { 

        // create row
        rows[i] = []; 

        // create cells
        for (var j=0; j < size; j++) {
            rows[i].push(defaultValue);
        }

        // add row to matrix
        matrix.push(rows[i]);
    }
    return matrix;
}

console.log(defaultMatrix(6));

如果你想每次用0初始化矩阵,那么你可以进一步简化这样的脚本:

function defaultMatrix(size) { 
    var matrix = [];
    for (var i=0; i < size; i++) { 
        matrix.push(new Array(size));
    }
    return matrix;
}

console.log(defaultMatrix(6));