Actualización de 2017: respuesta de 2 líneas con vanilla JS
Todas las respuestas aquí son demasiado complicadas , la mayoría de ellas toman 20 líneas de código o incluso más.
Este ejemplo usa solo dos líneas de JavaScript vanilla , sin lodash, subrayado u otras bibliotecas:
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;
Actualizar:
Es el mismo que el anterior, pero mejorado para seguir estrictamente la Guía de estilo de JavaScript de Airbnb , validada con 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 agradecimiento especial a ZuBB por informarme sobre problemas de linter con el código original.
Ejemplo
Este es el ejemplo exacto de su pregunta:
let output = cartesian([1,2],[10,20],[100,200,300]);
Salida
Esta es la salida de ese 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 ] ]
Manifestación
Ver demostraciones en:
Sintaxis
La sintaxis que utilicé aquí no es nada nuevo. Mi ejemplo usa el operador de propagación y los demás parámetros, características de JavaScript definidas en la sexta edición del estándar ECMA-262 publicado en junio de 2015 y desarrollado mucho antes, mejor conocido como ES6 o ES2015. Ver:
Hace que un código como este sea tan simple que es un pecado no usarlo. Para las plataformas antiguas que no lo admiten de forma nativa, siempre puede usar Babel u otras herramientas para transpilarlo a una sintaxis anterior, y de hecho, mi ejemplo transpilado por Babel es aún más corto y simple que la mayoría de los ejemplos aquí, pero no es así. realmente importa porque la salida de la transpilación no es algo que deba comprender o mantener, es solo un hecho que me pareció interesante.
Conclusión
No es necesario escribir cientos de líneas de código que sean difíciles de mantener y no es necesario utilizar bibliotecas completas para algo tan simple, cuando dos líneas de JavaScript vanilla pueden hacer el trabajo fácilmente. Como puede ver, realmente vale la pena usar funciones modernas del lenguaje y, en los casos en que necesite admitir plataformas arcaicas sin soporte nativo de las funciones modernas, siempre puede usar Babel u otras herramientas para transpilar la nueva sintaxis a la anterior. .
No codifique como si fuera 1995
JavaScript evoluciona y lo hace por una razón. TC39 hace un trabajo increíble en el diseño del lenguaje al agregar nuevas funciones y los proveedores de navegadores hacen un trabajo increíble al implementar esas funciones.
Para ver el estado actual del soporte nativo de cualquier característica dada en los navegadores, consulte:
Para ver el soporte en las versiones de Node, consulte:
Para usar la sintaxis moderna en plataformas que no la admiten de forma nativa, use Babel: