2017 Update: คำตอบ 2 บรรทัดด้วย vanilla JS
คำตอบทั้งหมดที่นี่มีความซับซ้อนมากเกินไปส่วนใหญ่ใช้รหัส 20 บรรทัดหรือมากกว่านั้น
ตัวอย่างนี้ใช้วานิลลา JavaScriptเพียงสองบรรทัดไม่มี lodash ขีดล่างหรือไลบรารีอื่น ๆ :
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;
อัปเดต:
สิ่งนี้เหมือนกับข้างต้น แต่ได้รับการปรับปรุงให้ปฏิบัติตามคู่มือสไตล์ JavaScript ของ Airbnbอย่างเคร่งครัด- ตรวจสอบโดยใช้ESLintกับ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);
ขอขอบคุณเป็นพิเศษสำหรับZuBB ที่แจ้งให้เราทราบเกี่ยวกับปัญหาเศษกระดาษกับรหัสเดิม
ตัวอย่าง
นี่คือตัวอย่างที่แน่นอนจากคำถามของคุณ:
let output = cartesian([1,2],[10,20],[100,200,300]);
เอาต์พุต
นี่คือผลลัพธ์ของคำสั่งนั้น:
[ [ 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 ] ]
การสาธิต
ดูการสาธิตได้ที่:
ไวยากรณ์
ไวยากรณ์ที่ฉันใช้ที่นี่ไม่มีอะไรใหม่ ตัวอย่างของฉันใช้ตัวดำเนินการสเปรดและพารามิเตอร์ที่เหลือซึ่งเป็นคุณลักษณะของ JavaScript ที่กำหนดไว้ในมาตรฐาน ECMA-262 รุ่นที่ 6 ซึ่งเผยแพร่เมื่อเดือนมิถุนายน 2015 และได้รับการพัฒนาก่อนหน้านี้ซึ่งรู้จักกันดีในชื่อ ES6 หรือ ES2015 ดู:
มันทำให้โค้ดแบบนี้ง่ายมากจนเป็นบาปที่จะไม่ใช้มัน สำหรับแพลตฟอร์มเก่าที่ไม่รองรับโดยกำเนิดคุณสามารถใช้ Babel หรือเครื่องมืออื่น ๆ เพื่อถ่ายทอดไปยังไวยากรณ์ที่เก่ากว่าได้เสมอและอันที่จริงตัวอย่างของฉันที่ Babel ถ่ายทอดนั้นยังสั้นและง่ายกว่าตัวอย่างส่วนใหญ่ที่นี่ แต่ก็ไม่ได้ มีความสำคัญมากเพราะผลลัพธ์ของการถ่ายเทไม่ใช่สิ่งที่คุณต้องเข้าใจหรือรักษาไว้มันเป็นเพียงความจริงที่ฉันพบว่าน่าสนใจ
สรุป
ไม่จำเป็นต้องเขียนโค้ดหลายร้อยบรรทัดซึ่งยากต่อการดูแลรักษาและไม่จำเป็นต้องใช้ไลบรารีทั้งหมดสำหรับเรื่องง่ายๆเช่นนี้เมื่อวานิลลา JavaScript สองบรรทัดสามารถทำงานให้เสร็จได้อย่างง่ายดาย อย่างที่คุณเห็นว่าการใช้คุณสมบัติที่ทันสมัยของภาษานั้นคุ้มค่ามากและในกรณีที่คุณจำเป็นต้องสนับสนุนแพลตฟอร์มโบราณโดยไม่มีการสนับสนุนคุณลักษณะสมัยใหม่แบบดั้งเดิมคุณสามารถใช้ Babel หรือเครื่องมืออื่น ๆ เพื่อถ่ายทอดไวยากรณ์ใหม่ไปยังเวอร์ชันเก่าได้ตลอดเวลา .
อย่าเขียนโค้ดเหมือนปี 1995
JavaScript พัฒนาขึ้นและเป็นเช่นนั้นด้วยเหตุผล TC39 ทำงานได้อย่างยอดเยี่ยมในการออกแบบภาษาด้วยการเพิ่มคุณสมบัติใหม่ ๆ และผู้จำหน่ายเบราว์เซอร์ทำงานได้อย่างยอดเยี่ยมในการนำคุณสมบัติเหล่านั้นไปใช้
หากต้องการดูสถานะปัจจุบันของการสนับสนุนดั้งเดิมของคุณสมบัติที่กำหนดในเบราว์เซอร์โปรดดู:
หากต้องการดูการสนับสนุนในเวอร์ชันโหนดโปรดดู:
หากต้องการใช้ไวยากรณ์สมัยใหม่บนแพลตฟอร์มที่ไม่รองรับโดยกำเนิดให้ใช้ Babel: