Aggiornamento 2017: risposta su 2 righe con vanilla JS
Tutte le risposte qui sono eccessivamente complicate , la maggior parte richiede 20 righe di codice o anche di più.
Questo esempio utilizza solo due righe di vanilla JavaScript , nessun lodash, trattino basso o altre librerie:
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;
Aggiornare:
È lo stesso di sopra ma migliorato per seguire rigorosamente la Guida allo stile JavaScript di Airbnb , convalidata utilizzando ESLint con 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);
Un ringraziamento speciale a ZuBB per avermi informato dei problemi di linter con il codice originale.
Esempio
Questo è l'esempio esatto della tua domanda:
let output = cartesian([1,2],[10,20],[100,200,300]);
Produzione
Questo è l'output di quel comando:
[ [ 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 ] ]
dimostrazione
Guarda le demo su:
Sintassi
La sintassi che ho usato qui non è una novità. Il mio esempio utilizza l'operatore spread ei parametri rest, funzionalità di JavaScript definite nella 6a edizione dello standard ECMA-262 pubblicato a giugno 2015 e sviluppate molto prima, meglio note come ES6 o ES2015. Vedere:
Rende un codice come questo così semplice che è un peccato non usarlo. Per le vecchie piattaforme che non lo supportano in modo nativo puoi sempre usare Babel o altri strumenti per trasferirlo alla sintassi più vecchia - e in effetti il mio esempio trascritto da Babel è ancora più breve e più semplice della maggior parte degli esempi qui, ma non lo fa importa davvero perché l'output di transpilation non è qualcosa che devi capire o mantenere, è solo un fatto che ho trovato interessante.
Conclusione
Non è necessario scrivere centinaia di righe di codice difficili da mantenere e non è necessario utilizzare intere librerie per una cosa così semplice, quando due righe di JavaScript vanilla possono facilmente portare a termine il lavoro. Come puoi vedere, utilizzare le funzionalità moderne del linguaggio ripaga davvero e nei casi in cui devi supportare piattaforme arcaiche senza supporto nativo delle funzionalità moderne puoi sempre utilizzare Babel o altri strumenti per trasferire la nuova sintassi a quella vecchia .
Non programmare come se fosse il 1995
JavaScript si evolve e lo fa per un motivo. TC39 fa un lavoro straordinario nella progettazione del linguaggio con l'aggiunta di nuove funzionalità ei fornitori di browser fanno un lavoro straordinario nell'implementare tali funzionalità.
Per vedere lo stato corrente del supporto nativo di una determinata funzionalità nei browser, vedere:
Per vedere il supporto nelle versioni di Node, vedere:
Per utilizzare la sintassi moderna su piattaforme che non la supportano in modo nativo, usa Babel: