Pembaruan 2017: Jawaban 2 baris dengan vanilla JS
Semua jawaban di sini terlalu rumit , kebanyakan mengambil 20 baris kode atau bahkan lebih.
Contoh ini hanya menggunakan dua baris vanilla JavaScript , tanpa lodash, garis bawah, atau pustaka lainnya:
let f = (a, b) => [].concat(...a.map(a => b.map(b => [].concat(a, b))));
let cartesian = (a, b, ...c) => b ? cartesian(f(a, b), ...c) : a;
Memperbarui:
Ini sama seperti di atas tetapi ditingkatkan untuk mengikuti Panduan Gaya JavaScript Airbnb dengan ketat - divalidasi menggunakan ESLint dengan eslint-config-airbnb-base :
const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e))));
const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);
Terima kasih khusus kepada ZuBB karena telah memberi tahu saya tentang masalah linter dengan kode asli.
Contoh
Ini adalah contoh tepat dari pertanyaan Anda:
let output = cartesian([1,2],[10,20],[100,200,300]);
Keluaran
Ini adalah keluaran dari perintah itu:
[ [ 1, 10, 100 ],
[ 1, 10, 200 ],
[ 1, 10, 300 ],
[ 1, 20, 100 ],
[ 1, 20, 200 ],
[ 1, 20, 300 ],
[ 2, 10, 100 ],
[ 2, 10, 200 ],
[ 2, 10, 300 ],
[ 2, 20, 100 ],
[ 2, 20, 200 ],
[ 2, 20, 300 ] ]
Demo
Lihat demo di:
Sintaksis
Sintaks yang saya gunakan di sini bukanlah hal baru. Contoh saya menggunakan operator penyebaran dan parameter lainnya - fitur JavaScript yang ditentukan dalam standar ECMA-262 edisi ke-6 yang diterbitkan pada Juni 2015 dan dikembangkan jauh lebih awal, lebih dikenal sebagai ES6 atau ES2015. Lihat:
Itu membuat kode seperti ini begitu sederhana sehingga dosa untuk tidak menggunakannya. Untuk platform lama yang tidak mendukungnya secara native, Anda selalu dapat menggunakan Babel atau alat lain untuk mentranspilasinya ke sintaks yang lebih lama - dan sebenarnya contoh saya yang ditranspilasi oleh Babel masih lebih pendek dan sederhana daripada kebanyakan contoh di sini, tetapi tidak sangat penting karena keluaran transpilasi bukanlah sesuatu yang perlu Anda pahami atau pertahankan, itu hanya fakta yang menurut saya menarik.
Kesimpulan
Tidak perlu menulis ratusan baris kode yang sulit dipelihara dan tidak perlu menggunakan seluruh pustaka untuk hal yang sesederhana itu, ketika dua baris vanilla JavaScript dapat dengan mudah menyelesaikan pekerjaan. Seperti yang Anda lihat, sangat bermanfaat untuk menggunakan fitur-fitur modern dari bahasa tersebut dan dalam kasus di mana Anda perlu mendukung platform kuno tanpa dukungan asli dari fitur-fitur modern, Anda selalu dapat menggunakan Babel atau alat lain untuk memindahkan sintaks baru ke yang lama. .
Jangan membuat kode seperti tahun 1995
JavaScript berkembang dan melakukannya karena suatu alasan. TC39 melakukan pekerjaan luar biasa dalam desain bahasa dengan menambahkan fitur baru dan vendor browser melakukan pekerjaan luar biasa dalam mengimplementasikan fitur tersebut.
Untuk melihat status dukungan asli saat ini dari setiap fitur yang diberikan di browser, lihat:
Untuk melihat dukungan dalam versi Node, lihat:
Untuk menggunakan sintaks modern pada platform yang tidak mendukungnya secara native, gunakan Babel: