2017 अपडेट: वेनिला जेएस के साथ 2-लाइन उत्तर
यहां सभी उत्तर अत्यधिक जटिल हैं , उनमें से अधिकांश कोड की 20 लाइनें या उससे भी अधिक लेते हैं।
यह उदाहरण वनिला जावास्क्रिप्ट की सिर्फ दो पंक्तियों का उपयोग करता है , कोई लॉश, अंडरस्कोर या अन्य लाइब्रेरी नहीं:
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;
अपडेट करें:
यह ऊपर के समान है, लेकिन एयरबिन जावास्क्रिप्ट स्टाइल गाइड का सख्ती से पालन करने के लिए सुधार हुआ है - जिसका उपयोग करके मान्य किया गया है ESLint साथ eslint-config-Airbnb आधार :
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 ] ]
डेमो
डेमो देखें:
वाक्य - विन्यास
मैंने यहां जो वाक्य-विन्यास का उपयोग किया है, वह कोई नई बात नहीं है। मेरा उदाहरण प्रसार ऑपरेटर और बाकी मापदंडों का उपयोग करता है - जून 2015 को प्रकाशित ईसीएमए -262 मानक के 6 वें संस्करण में परिभाषित जावास्क्रिप्ट की विशेषताएं और बहुत पहले विकसित, जिसे ईएस 6 या ईएस2015 के रूप में जाना जाता है। देख:
यह इस तरह से कोड को इतना सरल बनाता है कि इसका उपयोग न करना एक पाप है। पुराने प्लेटफ़ॉर्म के लिए जो इसे मूल रूप से समर्थन नहीं करते हैं, आप इसे पुराने सिंटैक्स में ट्रांसपाइल करने के लिए हमेशा बैबेल या अन्य टूल का उपयोग कर सकते हैं - और वास्तव में बैबेल द्वारा ट्रांसलेट किया गया मेरा उदाहरण अभी भी यहां के अधिकांश उदाहरणों की तुलना में छोटा और सरल है, लेकिन यह नहीं है वास्तव में मामला क्योंकि ट्रांसप्लीकेशन का आउटपुट कुछ ऐसा नहीं है जिसे आपको समझने या बनाए रखने की आवश्यकता है, यह सिर्फ एक तथ्य है जो मुझे दिलचस्प लगा।
निष्कर्ष
कोड की सौ पंक्तियों को लिखने की आवश्यकता नहीं है जो बनाए रखना कठिन है और इस तरह की एक साधारण चीज के लिए संपूर्ण पुस्तकालयों का उपयोग करने की आवश्यकता नहीं है, जब वेनिला जावास्क्रिप्ट की दो पंक्तियों को आसानी से काम मिल सकता है। जैसा कि आप देख सकते हैं कि यह भाषा की आधुनिक विशेषताओं का उपयोग करने के लिए वास्तव में भुगतान करता है और ऐसे मामलों में जहां आपको आधुनिक सुविधाओं के मूल समर्थन के साथ पुरातन प्लेटफार्मों का समर्थन करने की आवश्यकता नहीं है, आप हमेशा नए वाक्यविन्यास को पुराने के लिए ट्रांसफ़िल करने के लिए बैबल या अन्य टूल का उपयोग कर सकते हैं ।
यह 1995 की तरह कोड नहीं है
जावास्क्रिप्ट विकसित होता है और यह एक कारण के लिए ऐसा करता है। TC39 नई सुविधाओं को जोड़ने के साथ भाषा डिजाइन का एक अद्भुत काम करता है और ब्राउज़र विक्रेता उन सुविधाओं को लागू करने का एक अद्भुत काम करते हैं।
ब्राउज़रों में किसी भी सुविधा के मूल समर्थन की वर्तमान स्थिति देखने के लिए, देखें:
नोड संस्करणों में समर्थन देखने के लिए, देखें:
उन प्लेटफार्मों पर आधुनिक सिंटैक्स का उपयोग करने के लिए जो इसे मूल रूप से समर्थन नहीं करते हैं, Babel का उपयोग करें: