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]
,等等。谢谢,这也行!我可能会选择这个,因为我甚至不需要声明行。