在javascript中用矩阵的列交换行(换位)

在javascript中用矩阵的列交换行(换位),javascript,matrix,multidimensional-array,swap,Javascript,Matrix,Multidimensional Array,Swap,例如,我有这样一个矩阵: |1 2 3| |4 5 6| |7 8 9| |1 4 7| |2 5 8| |3 6 9| 我需要它转换成这样的矩阵: |1 2 3| |4 5 6| |7 8 9| |1 4 7| |2 5 8| |3 6 9| 实现这一目标的最佳方式是什么?就像其他语言一样: int[][] copy = new int[columns][rows]; for (int i = 0; i < rows; ++i) { for

例如,我有这样一个矩阵:

|1 2 3|    
|4 5 6|
|7 8 9|
|1 4 7|    
|2 5 8|
|3 6 9|
我需要它转换成这样的矩阵:

|1 2 3|    
|4 5 6|
|7 8 9|
|1 4 7|    
|2 5 8|
|3 6 9|

实现这一目标的最佳方式是什么?

就像其他语言一样:

int[][] copy = new int[columns][rows];
for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < columns; ++j) {
        copy[j][i] = original[i][j];
    }
}
int[]copy=newint[列][行];
对于(int i=0;i
您只需要在JS中以不同的方式构造2D数组。像这样:

函数转置(原始){
var copy=[];
对于(变量i=0;i参见文章:

函数转置(a){
//计算阵列的宽度和高度
var w=a.长度| | 0;
var h=数组的[0]实例?a[0]。长度:0;
//如果是零矩阵,则不需要转置例程。
如果(h==0 | | w==0){return[];}
/**
*@var{Number}i计数器
*@var{Number}j计数器
*@var{Array}t转置数据存储在此数组中。
*/
var i,j,t=[];
//循环遍历外部数组中的每个项(高度)
对于(i=0;i由找到。令人惊讶的是,它甚至比的更简洁和完整。它在
map()
的范围内隐式检索列和行长度

函数转置(a){
返回Object.keys(a[0]).map(函数(c){
返回a.map(函数(r){返回r[c];});
});
}
console.log(转置)([
[1,2,3],
[4,5,6],
[7,8,9]

]));
我没有足够的声誉发表评论(wtf.),所以我需要单独发布一个答案:

function transpose(a) {
    return a[0].map(function (_, c) { return a.map(function (r) { return r[c]; }); });
}
使用ES6中的箭头函数的精简版:

function transpose(matrix) {
    return Object.keys(matrix[0])
        .map(colNumber => matrix.map(rowNumber => rowNumber[colNumber]));
}

IEXGood point不支持Object.keys。我没有注意到。谢谢你的提示。虽然这里有详细的修复方法…@hobs你能解释一下
a[0]
是什么吗?@AlanH它是数组数组中的第一个内部数组。这个内部数组是2D数组(矩阵)的第一行如果您将数据存储在中,那么请提供更多详细信息。不幸的是,这种方法会为应用程序中的每个数组添加一个新元素!请看这里:@vektor您的输入应该像[[1,2,3,4]]一样,您还应该像
for(p中的var key){if(p.hasOwnProperty(key)){
如果您计划在中为..做,但是是的,扩展数组可能是个坏主意。我将更改示例。感谢更新的示例。我的观点是,原始解决方案破坏了所有数组…与其他解决方案不同,此解决方案适用于锯齿数组,即,如果您将[4,5,6]更改为[4,5,6,0],此解决方案仍然有效。其他解决方案则不行。