Saya punya array array, seperti:
[
[1,2,3],
[1,2,3],
[1,2,3],
]
Saya ingin memindahkannya untuk mendapatkan array berikut:
[
[1,1,1],
[2,2,2],
[3,3,3],
]
Tidak sulit untuk melakukan pemrograman menggunakan loop:
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;
}
Namun, ini kelihatannya besar, dan saya merasa harus ada cara yang lebih mudah untuk melakukannya. Disana?
javascript
arrays
matrix
transpose
ckersch
sumber
sumber
arrayLength
parameter yang digunakan untuk tepatnya? Untuk memastikan bahwa Anda tidak melampaui sejumlah elemen dalam array?Jawaban:
sumber
array[0].map
bukannyaarray.map
?array[0].map
karena dia ingin mengulangi berapa kali pun ada kolom,array.map
akan mengulangi berapa banyak baris yang ada.loops
lebih lambat 45% darimap
. Dan ya, transposnya dengan benar, sehingga proses kedua mengembalikan matriks awal.inilah implementasi saya di browser modern (tanpa ketergantungan):
sumber
Anda dapat menggunakan underscore.js
sumber
rambda
yang bisa Anda lakukanconst transpose = apply(zip)
cara terpendek dengan
lodash
/underscore
danes6
:dimana
matrix
bisa:sumber
_.zip.apply(_, matrix)
Banyak jawaban bagus di sini! Saya menggabungkannya menjadi satu jawaban dan memperbarui beberapa kode untuk sintaksis yang lebih modern:
One-liner terinspirasi oleh Fawad Ghafoor dan Óscar Gómez Alcañiz
Gaya pendekatan fungsional dengan mengurangi oleh Andrew Tatomyr
Lodash / Underscore oleh marcel
Pendekatan vanilla
Pendekatan ES6 vanilla in-place terinspirasi oleh Emanuel Saringan
sumber
Rapi dan murni:
Solusi sebelumnya dapat menyebabkan kegagalan jika array kosong disediakan.
Ini dia sebagai fungsi:
Memperbarui. Itu dapat ditulis lebih baik dengan operator spread:
sumber
Anda dapat melakukannya di tempat dengan hanya melakukan satu pass:
sumber
[arr[j][j],arr[i][j]] = [arr[i][j],arr[j][j]]
tetapi tampaknya tidak berhasil, apakah saya kehilangan sesuatu?[arr[j][i], arr[i][j]] = [arr[i][j], arr[j][i]]
. Perhatikan bahwa Anda memiliki beberapaarr[j][j]
istilah yang akan selalu merujuk ke sel pada diagonal.Hanya menggunakan variasi lain
Array.map
. Menggunakan indeks memungkinkan untuk mengubah posisi matriks di manaM != N
:Yang perlu dilakukan transposing adalah memetakan elemen-elemen kolom terlebih dahulu, lalu dengan baris.
sumber
Jika Anda memiliki opsi untuk menggunakan sintaks Ramda JS dan ES6, maka inilah cara lain untuk melakukannya:
sumber
transpose
fungsi sekarang.Pendekatan lain dengan iterasi array dari luar ke dalam dan mengurangi matriks dengan memetakan nilai-nilai dalam.
sumber
Jika menggunakan RamdaJS adalah opsi, ini dapat dicapai dalam satu baris:
R.transpose(myArray)
sumber
Anda dapat mencapai ini tanpa loop dengan menggunakan yang berikut ini.
Array
Array.prototype.map
Array.prototype.reduce
Array.prototype.join
String.prototype.split
Terlihat sangat elegan dan tidak memerlukan dependensi seperti jQuery of Underscore.js .
Diperkecil
Ini demo yang saya lempar bersama. Perhatikan kurangnya loop :-)
sumber
ES6 1liners sebagai:
begitu sama dengan Óscar, tetapi seperti yang Anda inginkan putar searah jarum jam:
sumber
Sunting: Jawaban ini tidak akan mengubah posisi matriks, tetapi memutarnya. Saya tidak membaca pertanyaan dengan seksama sejak awal: D
rotasi searah jarum jam dan berlawanan arah jarum jam:
sumber
Saya menemukan jawaban di atas sulit dibaca atau terlalu bertele-tele, jadi saya menulis sendiri. Dan saya pikir ini adalah cara paling intuitif untuk mengimplementasikan transpos dalam aljabar linier, Anda tidak melakukan pertukaran nilai , tetapi cukup masukkan setiap elemen ke tempat yang tepat dalam matriks baru:
sumber
Saya pikir ini sedikit lebih mudah dibaca. Ini menggunakan
Array.from
dan logika identik dengan menggunakan loop bersarang:Jika Anda berurusan dengan array dengan panjang yang tidak sama, Anda perlu mengganti
arr[0].length
dengan yang lain:sumber
sumber
sumber
Implementasi bebas pustaka di TypeScript yang bekerja untuk bentuk matriks apa pun yang tidak akan memotong array Anda:
sumber
Satu-liner yang tidak mengubah array yang diberikan.
sumber
sumber
Saya tidak menemukan jawaban yang memuaskan saya, jadi saya menulis sendiri, saya pikir mudah dimengerti dan diterapkan dan cocok untuk semua situasi.
sumber
Karena tidak ada yang sejauh ini menyebutkan pendekatan rekursif fungsional di sini yang saya ambil. Adaptasi dari Haskell
Data.List.transpose
.sumber