2d数组中所有有效邻居的数组

时间:2018-01-26 03:36:21

标签: javascript

所以我有一个(随机生成的)2d数组,如下所示:

[
     [0,1,2],
     [2,0,0],
     [1,0,2]
]

对于数组中的每个项目,我需要能够获取其X和Y坐标,并获取有关它的邻居的信息,

例如x = 0和y = 0将由两个索引引用到左上角,因此我需要创建一个顶部中间值,中心值和左中间值的数组。如果x = 1且y = 1,那么我需要获取所有8个其他值。 2D阵列的大小和形状可能不同,因此解决方案不能依赖于3x3。

我如何获得具有有效值的新数组?

感谢

1 个答案:

答案 0 :(得分:0)

您的功能需要以下输入:

  • 您需要找到邻居的xy坐标是什么
  • neighbor
  • 的定义是什么?
  • 矩阵中的内容

从矩阵中获取值

要获得(x, y)坐标,我建议使用此功能:

// Returns `undefined` for out-of-bound coordinates
const getFromMatrix = m => ([x, y]) => (m[y] || [])[x];

这需要一个小的快捷方式:对于超出范围的值,它返回undefined。因此,它仅在您的矩阵不包含任何undefined值时才有效。

定义邻居

可以通过 delta xy值的数组来定义邻居:

// [ [ dX, dY ] ]
const neighborDirs = [
  [ -1, -1 ], [  0, -1 ], [ 1, -1 ],
  [ -1,  0 ],             [ 1,  0 ],
  [ -1,  1 ], [  0,  1 ], [ 1,  1 ]
];

这种数据格式可以轻松遍历所有邻居。如果您不想要对角线邻居,则从常量中删除左上角,右上角,左下角和右下角的delta对。

将它们链接在一起

最后一步是来自:

  1. 相邻指示,
  2. 矩阵中的值,
  3. 仅限不受界限的有效值
  4. 在代码中:

    // Assumes matrix does not contain `undefined` values
    const getNeighbors = (x, y, n, m) => n
      // From deltas to coordinates
      .map(([dX, dY]) => [ x + dX, y + dY ])
      // From coordinates to values
      .map(getFromMatrix(m))
      // Filter out-of-bounds
      .filter(v => v !== undefined)
    

    运行示例

    这是一个包含示例数据的正在运行的代码段:

    
    
    const matrix = [
       [0,1,2],
       [2,0,0],
       [1,0,2]
    ];
    
    // [ dX, dY ]
    const neighborDirs = [
      [ -1, -1 ], [  0, -1 ], [ 1, -1 ],
      [ -1,  0 ],             [ 1,  0 ],
      [ -1,  1 ], [  0,  1 ], [ 1,  1 ]
    ];
    
    // Returns `undefined` for out-of-bound coordinates
    const getFromMatrix = m => ([x, y]) => (m[y] || [])[x];
    
    // Assumes matrix does not contain `undefined` values
    const getNeighbors = (x, y, n, m) => n
      // From deltas to coordinates
      .map(([dX, dY]) => [ x + dX, y + dY ])
      // From coordinates to values
      .map(getFromMatrix(m))
      // Filter out-of-bounds
      .filter(v => v !== undefined)
    
    
    // 1, 2, 0
    console.log(
      "(0,0) =>", 
      JSON.stringify(
        getNeighbors(0, 0, neighborDirs, matrix)
      )
    );
    
    // 0, 1, 2, 2, 0, 1, 0, 2
    console.log(
      "(1,1) =>", 
      JSON.stringify(
        getNeighbors(1, 1, neighborDirs, matrix)
      )
    );