Оновлення 2017 року: 2-рядова відповідь з ванільним JS
Усі відповіді тут надмірно складні , більшість з них займає 20 рядків коду або навіть більше.
У цьому прикладі використовуються лише два рядки JavaScript ванілі , без подачі, підкреслення чи інших бібліотек:
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: