How do I traverse an array diagonally in javascript [closed]
From top left to bottom right
var array = ["ABCD","EFGH","IJKL"];var Ylength = array.length;var Xlength = array[0].length;var maxLength = Math.max(Xlength, Ylength);var temp;for (var k = 0; k <= 2 * (maxLength - 1); ++k) { temp = []; for (var y = Ylength - 1; y >= 0; --y) { var x = k - y; if (x >= 0 && x < Xlength) { temp.push(array[y][x]); } } if(temp.length > 0) { document.body.innerHTML += temp.join('') + '<br>'; }}
(see also this Fiddle)
From the bottom left to top right
var array = ["ABCD","EFGH","IJKL"];var Ylength = array.length;var Xlength = array[0].length;var maxLength = Math.max(Xlength, Ylength);var temp;for (var k = 0; k <= 2 * (maxLength - 1); ++k) { temp = []; for (var y = Ylength - 1; y >= 0; --y) { var x = k - (Ylength - y); if (x >= 0 && x < Xlength) { temp.push(array[y][x]); } } if(temp.length > 0) { document.body.innerHTML += temp.join('') + '<br>'; }}
(see also this Fiddle)
Combined
As there's but a single line of difference between both, you can easily combine them in a single function :
var array = ["ABCD","EFGH","IJKL"];function diagonal(array, bottomToTop) { var Ylength = array.length; var Xlength = array[0].length; var maxLength = Math.max(Xlength, Ylength); var temp; var returnArray = []; for (var k = 0; k <= 2 * (maxLength - 1); ++k) { temp = []; for (var y = Ylength - 1; y >= 0; --y) { var x = k - (bottomToTop ? Ylength - y : y); if (x >= 0 && x < Xlength) { temp.push(array[y][x]); } } if(temp.length > 0) { returnArray.push(temp.join('')); } } return returnArray;}document.body.innerHTML = diagonal(array).join('<br>') + '<br><br><br>' + diagonal(array, true).join('<br>');
(see also this Fiddle)
This does the trick, and outputs the desired results to the screen:
var array = ['ABCD','EFGH','IJKL'];var rows = array.length;var cols = array[0].length;for (var n = 0; n < cols + rows - 1; n += 1){ var r = n; var c = 0; var str = ''; while (r >= 0 && c < cols) { if (r < rows) str += array[r][c]; r -= 1; c += 1; } document.write(str+"<br>");}
Result:
AEBIFCJGDKHL
Yet another solution:
function getAllDiagonal(array) { function row(offset) { var i = array.length, a = ''; while (i--) { a += array[i][j + (offset ? offset - i : i)] || ''; } return a; } var result = [[], []], j; for (j = 1 - array.length; j < array[0].length; j++) { result[0].push(row(0)); result[1].push(row(array.length - 1)); } return result;}var array = ['ABCD', 'EFGH', 'IJKL'];document.write('<pre>' + JSON.stringify(getAllDiagonal(array), 0, 4) + '</pre>');