Mise à jour 2017: réponse en 2 lignes avec Vanilla JS
Toutes les réponses ici sont trop compliquées , la plupart d'entre elles prennent 20 lignes de code ou même plus.
Cet exemple utilise juste deux lignes de JavaScript vanilla , pas de lodash, de trait de soulignement ou d'autres bibliothèques:
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;
Mettre à jour:
Ceci est le même que ci-dessus mais amélioré pour suivre strictement le guide de style JavaScript Airbnb - validé avec ESLint avec 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 merci spécial à ZuBB pour m'avoir informé des problèmes de linter avec le code d'origine.
Exemple
Voici l'exemple exact de votre question:
let output = cartesian([1,2],[10,20],[100,200,300]);
Production
Voici le résultat de cette commande:
[ [ 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 ] ]
Démo
Voir les démos sur:
Syntaxe
La syntaxe que j'ai utilisée ici n'a rien de nouveau. Mon exemple utilise l'opérateur de propagation et les paramètres rest - des fonctionnalités de JavaScript définies dans la 6e édition de la norme ECMA-262 publiée en juin 2015 et développée beaucoup plus tôt, mieux connue sous le nom d'ES6 ou ES2015. Voir:
Cela rend un code comme celui-ci si simple que c'est un péché de ne pas l'utiliser. Pour les anciennes plates-formes qui ne le prennent pas en charge de manière native, vous pouvez toujours utiliser Babel ou d'autres outils pour le transpiler dans une syntaxe plus ancienne - et en fait mon exemple transpilé par Babel est toujours plus court et plus simple que la plupart des exemples ici, mais ce n'est pas le cas. vraiment important parce que le résultat de la transpilation n'est pas quelque chose que vous devez comprendre ou maintenir, c'est juste un fait que j'ai trouvé intéressant.
Conclusion
Il n'est pas nécessaire d'écrire des centaines de lignes de code difficiles à maintenir et il n'est pas nécessaire d'utiliser des bibliothèques entières pour une chose aussi simple, quand deux lignes de JavaScript vanilla peuvent facilement faire le travail. Comme vous pouvez le voir, il est vraiment avantageux d'utiliser les fonctionnalités modernes du langage et dans les cas où vous devez prendre en charge des plates-formes archaïques sans support natif des fonctionnalités modernes, vous pouvez toujours utiliser Babel ou d'autres outils pour transposer la nouvelle syntaxe à l'ancienne. .
Ne codez pas comme si c'était 1995
JavaScript évolue et il le fait pour une raison. TC39 fait un travail incroyable de conception du langage en ajoutant de nouvelles fonctionnalités et les fournisseurs de navigateurs font un travail incroyable pour implémenter ces fonctionnalités.
Pour voir l'état actuel de la prise en charge native d'une fonctionnalité donnée dans les navigateurs, consultez:
Pour voir la prise en charge dans les versions Node, voir:
Pour utiliser la syntaxe moderne sur les plates-formes qui ne la prennent pas en charge de manière native, utilisez Babel: