Skip to content

transpose() function

transpose 函数接受多个迭代器作为输入,并返回转置的二维数组——交换行和列。

与现有的 zip 函数不同,transpose 的行为如下例所示:

Signature:

typescript
declare function transpose<
  T extends UniversalIterable,
  R extends UniversalIterable[],
>(iterables: T): (...args: R) => ReturnZipType<[T, ...R]>;

Example

ts
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]]

Open Source Code

Released under the Apache-2.0 License.