How would I change this method to not return the corner neighbours and instead only the neighbours directly above, below, left and right?
function getNeighbors(nodes, column, row) { var rowLimit = nodes.length - 1; var columnLimit = nodes[0].length - 1; for (let x = Math.max(0, column - 1); x <= Math.min(column + 1, columnLimit); x++) { for (let y = Math.max(0, row - 1); y <= Math.min(row + 1, rowLimit); y++) { if (x !== column || y !== row) { board.nodes[column][row].neighbours.push(nodes[x][y]); } } } }
Advertisement
Answer
If you allow me, I would avoid those two for
loops and I would just test directly, using if
s, to see if the neighbours I need exist.
See below, if my pseudo code helps you, I made an example 2D array filled with strings, but it is just for examplify the logic.
The example below is looking for the direct neighbours of nodes[2][1]
, which is in this case, “c1”, it has no bottom
let nodesExample = [ ["a0", "a1", "a2"], ["b0", "b1", "b2"], ["c0", "c1", "c2"], ] function getNeighbors(nodes, column, row) { let neighbours = [] //top if (column > 0 && nodes[column - 1][row]) { neighbours.push("top: " + nodes[column - 1][row]); } //bottom if (column < nodes.length - 1 && nodes[column + 1][row]) { neighbours.push("bottom: " + nodes[column + 1][row]); } //left if (nodes[column][row - 1]) { neighbours.push("left: " + nodes[column][row - 1]); } //right if (nodes[column][row + 1]) { neighbours.push("right: " + nodes[column][row + 1]); } return neighbours } console.log(getNeighbors(nodesExample, 2, 1))