我有一个数组的数组,就像这样:

[
    [1,2,3],
    [1,2,3],
    [1,2,3],
]

我想把它转置得到下面的数组:

[
    [1,1,1],
    [2,2,2],
    [3,3,3],
]

用循环来实现这一点并不难:

function transposeArray(array, arrayLength){
    var newArray = [];
    for(var i = 0; i < array.length; i++){
        newArray.push([]);
    };

    for(var i = 0; i < array.length; i++){
        for(var j = 0; j < arrayLength; j++){
            newArray[j].push(array[i][j]);
        };
    };

    return newArray;
}

然而,这看起来很笨重,我觉得应该有更简单的方法来做到这一点。是吗?


当前回答

扩展语法不应该用作push的替代品,它只应该在你不想改变现有数组的时候使用。

算法: 对于每一列,只要检查该列是否在结果矩阵中有一行,如果已经有一行,那么简单地推元素,否则创建一个新的行数组,然后推。

因此,与上面的许多其他解决方案不同,这个解决方案不会一次又一次地创建新数组,而是将相同的数组推入。

另外,花点时间了解Nullish Coalescing Operator的用法。

常量 转置= arr => arr。foreach ((v, i) => (m[i]) ??= [], m[i].push(v))), m), []), 矩阵= [[1,2,3],[1,2,3],[1,2,3]] console.log(转置矩阵)

其他回答

使用lodash/下划线和es6的最短方式:

_.zip(...matrix)

其中矩阵为:

const matrix = [[1,2,3], [1,2,3], [1,2,3]];

Const转置=数组=>数组[0]。Map ((r, i) =>数组。Map (c => c[i])); Console.log(转置([[2,3,4],[5,6,7]]));

如果你可以选择使用Ramda JS和ES6语法,那么这里有另一种方法来做到这一点:

const ' = = > R.map (c = > R.map (r = > [c], a), R.keys ([0])); console.log(转置([ [1,2,3,4], [5,6,7,8], [9,10,11,12] )));// => [[1,5,9],[2,6,10],[3,7,11],[4,8,12]]] < script src = " https://cdnjs.cloudflare.com/ajax/libs/ramda/0.22.1/ramda.min.js " > < /脚本>

干净的:

[[0, 1], [2, 3], [4, 5]].reduce((prev, next) => next.map((item, i) =>
    (prev[i] || []).concat(next[i])
), []); // [[0, 2, 4], [1, 3, 5]]

以前的解决方案在提供空数组时可能会导致失败。

这是一个函数:

function transpose(array) {
    return array.reduce((prev, next) => next.map((item, i) =>
        (prev[i] || []).concat(next[i])
    ), []);
}

console.log(transpose([[0, 1], [2, 3], [4, 5]]));

更新。 它可以用展开运算符写得更好:

const transpose = matrix => matrix.reduce(
    ($, row) => row.map((_, i) => [...($[i] || []), row[i]]), 
    []
)

扩展语法不应该用作push的替代品,它只应该在你不想改变现有数组的时候使用。

算法: 对于每一列,只要检查该列是否在结果矩阵中有一行,如果已经有一行,那么简单地推元素,否则创建一个新的行数组,然后推。

因此,与上面的许多其他解决方案不同,这个解决方案不会一次又一次地创建新数组,而是将相同的数组推入。

另外,花点时间了解Nullish Coalescing Operator的用法。

常量 转置= arr => arr。foreach ((v, i) => (m[i]) ??= [], m[i].push(v))), m), []), 矩阵= [[1,2,3],[1,2,3],[1,2,3]] console.log(转置矩阵)