var spiralOrder = function(matrix) { if (!matrix.length || !matrix[0].length) { return []; } const rows = matrix.length, columns = matrix[0].length; const visited = new Array(rows).fill(0).map(() => new Array(columns).fill(false)); const total = rows * columns; const order = new Array(total).fill(0); let directionIndex = 0, row = 0, column = 0; const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]; for (let i = 0; i < total; i++) { order[i] = matrix[row][column]; visited[row][column] = true; const nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1]; if (!(0 <= nextRow && nextRow < rows && 0 <= nextColumn && nextColumn < columns && !(visited[nextRow][nextColumn]))) { directionIndex = (directionIndex + 1) % 4; } row += directions[directionIndex][0]; column += directions[directionIndex][1]; } return order;};