Обновление 2017: 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, определенные в 6-м издании стандарта ECMA-262, опубликованного в июне 2015 года и разработанного намного раньше, более известного как ES6 или ES2015. Видеть:
Он делает такой код настолько простым, что грех не использовать его. Для старых платформ, которые не поддерживают его изначально, вы всегда можете использовать Babel или другие инструменты для преобразования его в старый синтаксис - и на самом деле мой пример, перенесенный Babel, все еще короче и проще, чем большинство примеров здесь, но это не так. действительно имеет значение, потому что результат транспиляции - это не то, что вам нужно понимать или поддерживать, это просто факт, который я нашел интересным.
Вывод
Нет необходимости писать сотни строк кода, который трудно поддерживать, и нет необходимости использовать целые библиотеки для такой простой вещи, когда две строки ванильного JavaScript могут легко выполнить работу. Как видите, использование современных функций языка действительно окупается, и в случаях, когда вам нужно поддерживать архаичные платформы без встроенной поддержки современных функций, вы всегда можете использовать Babel или другие инструменты для переноса нового синтаксиса в старый. .
Не пиши код, как будто это 1995 год
JavaScript развивается, и на это есть причина. TC39 отлично справляется с дизайном языка, добавляя новые функции, а поставщики браузеров проделывают потрясающую работу по реализации этих функций.
Чтобы увидеть текущее состояние встроенной поддержки любой данной функции в браузерах, см.
Чтобы увидеть поддержку в версиях Node, см .:
Чтобы использовать современный синтаксис на платформах, которые не поддерживают его изначально, используйте Babel: