2017年更新:バニラJSによる2行回答
ここでの回答はすべて非常に複雑です。ほとんどの回答は20行以上のコードを必要とします。
この例では、2行のバニラ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;
更新:
これは上記と同じですが、Airbnb JavaScriptスタイルガイドに厳密に準拠するように改善されています。eslint-config-airbnb-baseでESLintを使用して検証されています。
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 ] ]
デモ
デモを見る:
構文
ここで使用した構文は新しいものではありません。私の例では、spreadオペレーターと残りのパラメーター(2015年6月に発行され、以前に開発された、ES6またはES2015として知られる)のECMA-262標準の第6版で定義されたJavaScriptの機能を使用します。見る:
これは、このようなコードを非常に単純にするので、使用しないのは罪です。ネイティブでサポートしていない古いプラットフォームの場合、いつでもBabelまたは他のツールを使用して古い構文にトランスパイルできます。実際、Babelによってトランスパイルされた私の例は、ここにあるほとんどの例よりも短くて簡単ですが、実際にはそうではありません。トランスパイレーションの出力は、理解または維持する必要があるものではないため、本当に重要です。それは、私が興味深いと思った事実にすぎません。
結論
2行のバニラJavaScriptで簡単に作業を完了できるので、維持するのが難しい数百行のコードを記述する必要はなく、そのような単純なことのためにライブラリ全体を使用する必要もありません。ご覧のように、言語の最新機能を使用することは本当に効果的であり、最新機能のネイティブサポートなしで古いプラットフォームをサポートする必要がある場合は、いつでもBabelまたは他のツールを使用して新しい構文を古いものに変換できます。 。
1995年のようにコーディングしないでください
JavaScriptは進化し、それには理由があります。TC39は新しい機能を追加することで言語設計の素晴らしい仕事をし、ブラウザーベンダーはそれらの機能を実装する素晴らしい仕事をします。
ブラウザの特定の機能のネイティブサポートの現在の状態を確認するには、以下を参照してください。
Nodeバージョンでのサポートを確認するには、以下を参照してください。
ネイティブでサポートしていないプラットフォームで最新の構文を使用するには、Babelを使用します。