Update 2017: 2-zeilige Antwort mit Vanilla JS
Alle Antworten hier sind zu kompliziert . Die meisten von ihnen benötigen 20 Codezeilen oder sogar mehr.
In diesem Beispiel werden nur zwei Zeilen Vanille-JavaScript verwendet , kein Lodash, Unterstrich oder andere Bibliotheken:
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;
Aktualisieren:
Dies ist das gleiche wie oben, wurde jedoch verbessert, um den Airbnb JavaScript Style Guide genau zu befolgen - validiert mit ESLint mit 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);
Besonderer Dank geht an ZuBB, die mich über Linterprobleme mit dem Originalcode informiert haben.
Beispiel
Dies ist das genaue Beispiel aus Ihrer Frage:
let output = cartesian([1,2],[10,20],[100,200,300]);
Ausgabe
Dies ist die Ausgabe dieses Befehls:
[ [ 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 ] ]
Demo
Siehe Demos zu:
Syntax
Die Syntax, die ich hier verwendet habe, ist nichts Neues. In meinem Beispiel werden der Spread-Operator und die Restparameter verwendet - Funktionen von JavaScript, die in der 6. Ausgabe des im Juni 2015 veröffentlichten und viel früher entwickelten ECMA-262-Standards definiert wurden, besser bekannt als ES6 oder ES2015. Sehen:
Es macht Code wie diesen so einfach, dass es eine Sünde ist, ihn nicht zu benutzen. Für alte Plattformen, die es nicht nativ unterstützen, können Sie immer Babel oder andere Tools verwenden, um es auf ältere Syntax zu transpilieren - und tatsächlich ist mein von Babel transpiliertes Beispiel immer noch kürzer und einfacher als die meisten Beispiele hier, aber es ist nicht so wirklich wichtig, weil die Ausgabe der Transpilation nicht etwas ist, das Sie verstehen oder aufrechterhalten müssen, sondern nur eine Tatsache, die ich interessant fand.
Fazit
Es ist nicht erforderlich, Hunderte von Codezeilen zu schreiben, die schwer zu warten sind, und es ist nicht erforderlich, ganze Bibliotheken für eine so einfache Sache zu verwenden, wenn zwei Zeilen Vanille-JavaScript die Aufgabe problemlos erledigen können. Wie Sie sehen, lohnt es sich wirklich, moderne Funktionen der Sprache zu verwenden. In Fällen, in denen Sie archaische Plattformen ohne native Unterstützung der modernen Funktionen unterstützen müssen, können Sie immer Babel oder andere Tools verwenden, um die neue Syntax auf die alte zu übertragen .
Codieren Sie nicht wie 1995
JavaScript entwickelt sich aus einem bestimmten Grund weiter. TC39 leistet hervorragende Arbeit im Sprachdesign, indem es neue Funktionen hinzufügt, und die Browser-Anbieter leisten hervorragende Arbeit bei der Implementierung dieser Funktionen.
Informationen zum aktuellen Status der nativen Unterstützung einer bestimmten Funktion in den Browsern finden Sie unter:
Informationen zur Unterstützung in Node-Versionen finden Sie unter:
Verwenden Sie Babel, um die moderne Syntax auf Plattformen zu verwenden, die sie nicht nativ unterstützen: