transpose
transpose() function
The transpose function takes multiple iterators as input and returns a transposed 2D array—swapping rows with columns.
Unlike the existing zip function, transpose behaves as shown in the example below:
Signature:
declare function transpose<T extends UniversalIterable, R extends UniversalIterable[]>(iterables: T): (...args: R) => ReturnZipType<[T, ...R]>;
Example
const iter = transpose([1, 'a'], [2, 'b'], [3, 'c']);
iter.next() // {done:false, value: [1, 2, 3]}
iter.next() // {done:false, value: ['a', 'b', 'c']}
iter.next() // {done:true, value: undefined}
const iter = transpose([1, 2, 3], ['a', 'b', 'c']);
iter.next() // {done:false, value: [1, 'a']}
iter.next() // {done:false, value: [2, 'b']}
iter.next() // {done:false, value: [3, 'c']}
iter.next() // {done:true, value: undefined}
// How transpose differs from `zip`
const iter = zip([1, 2], [3], [], [4, 5, 6], [7], [8, 9]);
iter.next() // {done:true, value: undefined}
// Because zip stops at the shortest input, passing an empty array causes it to exit immediately.
// with pipe
pipe(
[4, 5, 6, 7],
transpose([1, 2, 3]),
toArray,
) // [[ 1, 4 ], [ 2, 5 ], [ 3, 6 ], [7]]
pipe(
Promise.resolve([4, 5, 6, 7]),
transpose([1, 2, 3]),
toArray,
) // [[ 1, 4 ], [ 2, 5 ], [ 3, 6 ], [7]]
// with toAsync
pipe(
[Promise.resolve(4), Promise.resolve(5), Promise.resolve(6), Promise.resolve(7)],
toAsync,
transpose([1, 2, 3]),
toArray,
) // [[ 1, 4 ], [ 2, 5 ], [ 3, 6 ], [7]]