所以我有一个(随机生成的)2d数组,如下所示:
[
[0,1,2],
[2,0,0],
[1,0,2]
]
对于数组中的每个项目,我需要能够获取其X和Y坐标,并获取有关它的邻居的信息,
例如x = 0和y = 0将由两个索引引用到左上角,因此我需要创建一个顶部中间值,中心值和左中间值的数组。如果x = 1且y = 1,那么我需要获取所有8个其他值。 2D阵列的大小和形状可能不同,因此解决方案不能依赖于3x3。
我如何获得具有有效值的新数组?
感谢
答案 0 :(得分:0)
您的功能需要以下输入:
x
和y
坐标是什么要获得(x, y)
坐标,我建议使用此功能:
// Returns `undefined` for out-of-bound coordinates
const getFromMatrix = m => ([x, y]) => (m[y] || [])[x];
这需要一个小的快捷方式:对于超出范围的值,它返回undefined
。因此,它仅在您的矩阵不包含任何undefined
值时才有效。
可以通过 delta x
和y
值的数组来定义邻居:
// [ [ dX, dY ] ]
const neighborDirs = [
[ -1, -1 ], [ 0, -1 ], [ 1, -1 ],
[ -1, 0 ], [ 1, 0 ],
[ -1, 1 ], [ 0, 1 ], [ 1, 1 ]
];
这种数据格式可以轻松遍历所有邻居。如果您不想要对角线邻居,则从常量中删除左上角,右上角,左下角和右下角的delta对。
最后一步是来自:
在代码中:
// 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)
)
);