从二维网格 javascript 中查找一维数组上的数组索引



假设我有以下网格,网格的每个单元格都有一个映射到 1d 数组的索引。

0, 1, 2
3, 4, 5,
6, 7, 8

我可以用一个 1d 数组来表示这一点,例如:[0, 1, 2, 3, 4, 5, 6, 7, 8]

我想知道一种将 2d 坐标(如(3,1))映射到数组中索引的简单方法,在这种情况下,将是2.

经过大量研究,我发现很多人提出了这个等式:index = x + (y * width),但它似乎在我的测试中不起作用。

例如,对于(1, 1),结果将是index = 1 + (1 * 3) = 4,而对于(3, 1)将是index = 3 + (1 * 3) = 6,这对我来说没有任何意义。

是否有可能以简单的方式实现这一目标?或者我需要像 for 这样的迭代器?

二维矩阵表示法通常(row, col)索引从0开始

因此,(3, 1)无效:只有 3 行,从 0 到 2。(1, 1)表示第 2 行,第 2 列,在您的示例中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) * width),因为您的坐标系从 1 开始,数组从 0 开始。

let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
function getPosition(x, y, width) {
return x - 1 + (y - 1) * width;
}
console.log({
position: getPosition(3, 1, 3),
element: arr[getPosition(3, 1, 3)]
});

它确实是index = x + y * width的(括号是不必要的)或index = y + x * width,这取决于你是希望平面数组像你的问题一样将行保持在一起([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]index = x + y * width),还是保持列在一起([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
const a = [0, 1, 2, 3, 4, 5, 6, 7, 8];
let x = 0, y = 1;
let index = x + y * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);
x = 2;
y = 0;
index = x + y * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);

这是第二个:

// 0, 1, 2
// 3, 4, 5
// 6, 7, 8
const a = [0, 3, 6, 1, 4, 7, 2, 5, 8];
let x = 0, y = 1;
let index = y + x * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);
x = 2;
y = 0;
index = y + x * 3;
console.log(`(${x}, ${y}) is index ${index}, value ${a[index]}`);

相关内容

  • 没有找到相关文章

最新更新