Javascript 由数组数组表示的表不';行不通

Javascript 由数组数组表示的表不';行不通,javascript,Javascript,我正在尝试创建一个数组,它将表示一个数字表。出于某种原因,第一行正在复制第二行。这是我的密码: var numbers = [1, 2, 3, 4, 5, 6, 7, 8], rows = 2, cols = 4, i, j, row = [], table = []; for (i = 0; i < rows; i += 1) { for (j = 0; j < cols; j += 1) { row[j] =

我正在尝试创建一个数组,它将表示一个数字表。出于某种原因,第一行正在复制第二行。这是我的密码:

var numbers = [1, 2, 3, 4, 5, 6, 7, 8],
    rows = 2,
    cols = 4,
    i,
    j,
    row = [],
    table = [];
for (i = 0; i < rows; i += 1) {
    for (j = 0; j < cols; j += 1) {
        row[j] = numbers[i * cols + j];
        console.log(row[j]);
        console.log(row);
    }
    console.log(row);
    table[i] = row;
}
console.log(table);
var number=[1,2,3,4,5,6,7,8],
行=2,
cols=4,
我
J
行=[],
表=[];
对于(i=0;i<行;i+=1){
对于(j=0;j

如您所见,即使在第一行(i==0)上,写出当前数字也是正确的(1或2或3或4),但写出整行是从第二行(5或5、6或5、6、7或5、6、7、8)写出数字。我错过了什么明显的东西吗?谢谢

您总是引用相同的行数组,每次迭代都需要一个新的行数组:

var numbers = [1, 2, 3, 4, 5, 6, 7, 8],
    rows = 2,
    cols = 4,
    i,
    j,
    table = [];
for (i = 0; i < rows; i += 1) {
    table[i] = [];
    for (j = 0; j < cols; j += 1) {
        table[i][j] = numbers[i * cols + j];
    }
}

console.log(table);
var number=[1,2,3,4,5,6,7,8],
行=2,
cols=4,
我
J
表=[];
对于(i=0;i<行;i+=1){
表[i]=[];
对于(j=0;j
您只声明了
var行=[]

因此,您将继续写入同一个变量,该变量将继续覆盖以前的值

而是在循环中声明它以保持重新设置

var numbers = [1, 2, 3, 4, 5, 6, 7, 8],
    rows = 2,
    cols = 4,
    i,
    j,
    //row = [], not here - move to loop
    table = [];
for (i = 0; i < rows; i += 1) {
    var row = []; // declare row each time!

    for (j = 0; j < cols; j += 1) {
        row[j] = numbers[i * cols + j];
    }

    table[i] = row;
}
var number=[1,2,3,4,5,6,7,8],
行=2,
cols=4,
我
J
//行=[],不在此处-移动到循环
表=[];
对于(i=0;i<行;i+=1){
var row=[];//每次声明行!
对于(j=0;j

-每次重新设置行



为什么不简单地创建一个数组<代码>变量数=[[1,2,3],[4,5,6],[7,8,9]这就是我正在做的,但是表的数字和大小是动态的,所以我不能这样声明。谢谢,这很有效。我原以为每次迭代I都会覆盖这些行,但我想不会。我仍然不明白为什么在第一次迭代时,行不同(行[j]是1,但行是[5])。我猜这与提升有关?@user2872841:
table[I]=row
将对
row
的引用分配给
table[I]
而不是复制实际值。当
console.log(row)
在循环中运行时,您只打印出
row
当前的值。由于您没有在每次重写值时重新声明
,因此存储在
表[i]
中的引用每次都指向最新的值。通过在循环中声明
,您每次都在创建一个不同的
对象,因此
表[i]
每次都在接收一个不同的
对象的引用;谢谢你的解释。但奇怪的是,如果
console.log(row)
打印row的最新值,它为什么不首先打印[5,6,7,8]或者[5,2,3,4]?为什么它只打印[5]?@user2872841:我在原始代码的日志中添加了一些文本,它总是按照每个console.command的预期,在每次迭代中打印出当前值。请参阅格式化控制台日志。您可以看到
console.log(第[j]行)j
循环内的code>从
1
上升到
8
console.log(行)j
的右下方,code>从
[1]
开始,然后
[1,2]
,最后当您转到第二行
时,
j
将被重新设置为
0
,新值从一开始就被注入,因此您会看到
[5,2,3,4]
,然后
[5,6,3,4]
,等等。谢谢,这也行!我可能会选择这个,因为我甚至不需要声明行。