Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:是否有一种优雅的方法来生成2d数组中相邻单元格的坐标_Javascript - Fatal编程技术网

JavaScript:是否有一种优雅的方法来生成2d数组中相邻单元格的坐标

JavaScript:是否有一种优雅的方法来生成2d数组中相邻单元格的坐标,javascript,Javascript,假设我有一个网格,即2d数组 const grid = [ [0, 0, A, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, B, 0], [D, E, 0, C, F], [0, 0, 0, 0, 0], ] 例如,如果网格中的某些单元格可以访问所有相邻的4-directional,那么C位于[3,3],因此它可以访问[3,3+1],[3-1,3],[3+1,3]`[3,3-1],所以通常我必须像这样硬编码 //对!! 第一:任何时候当你在做网格逻

假设我有一个网格,即2d数组

const grid = [
  [0, 0, A, 0, 0],
  [0, 0, 0, 0, 0],
  [0, 0, 0, B, 0],
  [D, E, 0, C, F],
  [0, 0, 0, 0, 0],
]
例如,如果网格中的某些单元格可以访问所有相邻的4-directional,那么
C
位于
[3,3]
,因此它可以访问
[3,3+1]
[3-1,3]
[3+1,3]`[3,3-1]
,所以通常我必须像这样硬编码


//对!!
第一:任何时候当你在做网格逻辑的时候,首先检查一下你要说什么

老实说,这个链接拥有你所需要的一切

简短的版本是:如果你知道网格宽度和单元布局,你可以很容易地计算出任何单元邻居的坐标偏移量来定义“邻居”

该逻辑可以实现为一个纯函数,它需要网格尺寸和您想要的相邻单元(也称为“目标”单元)的坐标:

让MyNeights=GetCellNeights(
{x:2,y:2},//目标单元的坐标
{宽度:10,高度:10}//网格尺寸,以单元格为单位
)
或者,您可以创建一个有状态的对象,该对象在创建时接受网格维度,并计算一次偏移量,以便重新用于所有GetNeights调用:

让myGrid=新网格(10,10)
让MyNeights=myGrid.GetNeights(2,5)
让myBiggerGrid=新网格(25,25)
让OtherNeights=myBiggerGrid(2,5)

我想那很好。即使有一种不那么重复的方法,你目前的方法可能是最容易一目了然理解的方法,这才是最重要的most@CertainPerformance是的,我只是好奇是否有一种更聪明的方法来实现它,但它可能不像我最初的实现idkWhy生成它那样可读?如果只有少量的方向(例如2d垂直、2d水平、4d直线、4d对角线、8d),则硬编码是有意义的。你可以把更复杂的方向组合成更简单的方向,例如4d是2d垂直+2d水平,8d是4d直线+4d对角线,等等。@RobG,除非我在你的建议中遗漏了什么,扩展较小的扩展方向以生成较大的扩展方向将导致发现大量重复的单元格。答案不应仅限于链接。虽然解决方案可能在链接页面中,但只阅读下面的答案,我们这里只有“嘿!调用我从帽子上取下的magic
GetCellNeights()
函数和这个很棒的
Grid.GetNeights()
方法,来自我的魔法口袋。你需要源代码吗?啊,所有这些都是用magic实现的™."