locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
39 lines (38 loc) • 1.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transpose = transpose;
function transpose(rows) {
// discuss at: https://locutus.io/haskell/list/transpose/
// original by: Kevin van Zonneveld (https://kvz.io)
// note 1: Transposes rows and columns, dropping exhausted rows like Haskell Data.List.transpose.
// example 1: transpose([[1, 2, 3], [4, 5, 6]])
// returns 1: [[1, 4], [2, 5], [3, 6]]
// example 2: transpose([['a', 'b'], ['c'], ['d', 'e', 'f']])
// returns 2: [['a', 'c', 'd'], ['b', 'e'], ['f']]
// example 3: transpose([])
// returns 3: []
if (!Array.isArray(rows)) {
return [];
}
const queue = rows
.filter((row) => Array.isArray(row))
.map((row) => row.slice())
.filter((row) => row.length > 0);
const out = [];
while (queue.length > 0) {
const column = [];
for (let i = queue.length - 1; i >= 0; i--) {
const row = queue[i];
const head = row?.shift();
if (typeof head !== 'undefined') {
column.push(head);
}
if (!row || row.length === 0) {
queue.splice(i, 1);
}
}
column.reverse();
out.push(column);
}
return out;
}