我有一个数组的数组,就像这样:
[
[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;
}
然而,这看起来很笨重,我觉得应该有更简单的方法来做到这一点。是吗?
我觉得这样可读性更强一点。它使用Array.from,逻辑与使用嵌套循环相同:
Var arr = [
[1,2,3,4],
[1,2,3,4],
[1,2,3,4]
];
/*
* arr[0]。Length = 4 =结果行数
加勒比海盗。长度= 3 =结果cols的个数
* /
var result = Array.from({长度:arr[0].)长度},函数(x,行){
返回Array.from({长度:arr。长度},函数(x, col) {
返回arr (col)(行);
});
});
console.log(结果);
如果你在处理长度不等的数组,你需要替换arr[0]。长度与其他东西:
Var arr = [
(1、2),
[1,2,3],
[1,2,3,4]
];
/*
* arr[0]。Length = 4 =结果行数
加勒比海盗。长度= 3 =结果cols的个数
* /
var result = Array.from({长度:arr. from)Reduce(函数(max, item){返回item。长度>最大长度?项。长度:max;}, 0)},函数(x,行){
返回Array.from({长度:arr。长度},函数(x, col) {
返回arr (col)(行);
});
});
console.log(结果);
扩展语法不应该用作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(转置矩阵)