Javascript 从二维网格中查找一维数组上的数组索引
假设我有下面的网格,网格的每个单元格都有一个映射到1d数组的索引Javascript 从二维网格中查找一维数组上的数组索引,javascript,arrays,math,Javascript,Arrays,Math,假设我有下面的网格,网格的每个单元格都有一个映射到1d数组的索引 0, 1, 2 3, 4, 5, 6, 7, 8 我可以用1d数组来表示这一点,比如:[0,1,2,3,4,5,6,7,8] 我想知道一种将二维坐标(如(3,1))映射到其在数组中的索引的简单方法,在本例中是2 在做了大量研究之后,我发现很多人都在建议这个等式:index=x+(y*width),但在我的测试中它似乎不起作用 例如,对于(1,1),结果将是索引=1+(1*3)=4,对于(3,1),结果将是索引=3+(1*3)=6
0, 1, 2
3, 4, 5,
6, 7, 8
我可以用1d数组来表示这一点,比如:[0,1,2,3,4,5,6,7,8]
我想知道一种将二维坐标(如(3,1)
)映射到其在数组中的索引的简单方法,在本例中是2
在做了大量研究之后,我发现很多人都在建议这个等式:index=x+(y*width)
,但在我的测试中它似乎不起作用
例如,对于(1,1)
,结果将是索引=1+(1*3)=4
,对于(3,1)
,结果将是索引=3+(1*3)=6
,这对我来说没有任何意义
有没有可能以一种简单的方式实现这一点?或者我需要使用迭代器,比如for?2D矩阵表示法通常是
(行,列)
,索引从0开始
因此,(3,1)
无效:只有3行,从0到2(1,1)
表示第二行第二列,在您的示例中是4
。因此,公式如下:
(row * width) + col
(2, 1) = 2*3+1 = index 7
再次对第一行/列使用0
如果您真的想继续考虑从1开始的索引,只需将公式更改为:
((row - 1) * width) + (col - 1) = 1D index
在您的例子中,它将是
index=(x-1)+((y-1)*宽度)
,因为坐标系从1开始,数组从0开始
让arr=[0,1,2,3,4,5,6,7,8];
函数getPosition(x、y、宽度){
返回x-1+(y-1)*宽度;
}
console.log({
位置:getPosition(3,1,3),
元素:arr[getPosition(3,1,3)]
});
这确实是索引=x+y*宽度
(不需要括号)或索引=y+x*宽度
,这取决于您是否希望平面数组像您的问题一样将行保持在一起([0,1,2,3,4,5,6,7,8,9]
,索引=x+y*宽度
),或将列保持在一起([0,3,6,1,4,7,2,5,8]
,index=y+x*width
)。但是索引通常从0开始,而不是从1开始。所以你的(1,1)应该是(0,0),你的(3,1)应该是(2,0)
以下是第一点:
//0,1,2
// 3, 4, 5
// 6, 7, 8
常数a=[0,1,2,3,4,5,6,7,8];
设x=0,y=1;
设指数=x+y*3;
log(`(${x},${y})是索引${index},值${a[index]}`);
x=2;
y=0;
指数=x+y*3;
console.log(`(${x},${y})是索引${index},值${a[index]}`);
你知道js中的索引以0开头吗?2D矩阵表示法通常是(行,列)
,索引以0开头。因此,(3,1)
无效(只有3行,从0到2)。如果你从1开始索引,它将是(3,1)=6
,第3行,第1列。您应该使用索引=x-1+(y-1*宽度)
我确实想指出,虽然我不喜欢它,但数学确实经常使用基于1的索引。