![](/img/trans.png)
[英]Why do I get an Uncaught TypeError: property 4 is undefined when looping through a 2d array?
[英]How do I change a specific value found when looping a 2d array?
尝试替换数组中数组的值。 该数组只有值1或0,它是一个网格。 代码正在寻找1并将其更改为0,还将下面一行的相同列值更改为1。
我相信问题是我使if语句无效,而我试图进行更改。 导致出现错误信息。
function gravity() {
for (var i = 0; i < rows; i++) {
for (var j = 0; j < cols; j++) {
if (grid[i][j] === 1){
grid[i][j] = 0;
grid[i+1][j] = 1;
}
}
}
}
问题在于,当循环位于最后一行时,它将尝试将i+1
设置为1
,但是由于i
已经是最后一个索引,因此i+1
超出了范围。
要解决这个问题,您只需添加一个if
您还有另一个错误。 由于您从上到下进行插入,因此将任何1向下移动到下一行,然后遍历下一行并找到与您刚刚向下移动并再次向下移动它们完全相同的1。 重复此过程,直到所有1都消失了,一次调用gravity()。 要解决此问题,您必须从下到上遍历所有行。
var grid = [ [1,0,0,0], [0,0,1,0], [0,0,0,0], [0,1,0,0] ] var cols = 4; var rows = 4; function gravity() { for (var i = rows - 1; i >= 0; i--) { for (var j = 0; j < cols; j++) { if (grid[i][j] === 1){ grid[i][j] = 0; if(i+1 < rows) { grid[i+1][j] = 1; } } } } } var iterations = 0; var intervalId = setInterval(() => { gravity(); for(var row of grid) { console.log(row.join(',')) } console.log(""); iterations++; if(iterations == 4) { clearInterval(intervalId); } }, 400)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.