Aktualizacja 2017: 2-wierszowa odpowiedź z waniliowym JS
Wszystkie odpowiedzi tutaj są zbyt skomplikowane , większość z nich zajmuje 20 linii kodu lub nawet więcej.
W tym przykładzie użyto tylko dwóch wierszy zwykłego JavaScript , żadnych bibliotek lodash, podkreślenia ani innych:
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;
Aktualizacja:
Jest to to samo, co powyżej, ale poprawione, aby ściśle przestrzegać Przewodnika po stylach JavaScript Airbnb - zweryfikowanego za pomocą ESLint z 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);
Specjalne podziękowania dla ZuBB za poinformowanie mnie o problemach lintera z oryginalnym kodem.
Przykład
Oto dokładny przykład z Twojego pytania:
let output = cartesian([1,2],[10,20],[100,200,300]);
Wynik
Oto wynik tego polecenia:
[ [ 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 ] ]
Próbny
Zobacz dema na:
Składnia
Składnia, której tutaj użyłem, nie jest niczym nowym. Mój przykład wykorzystuje operator spreadu i pozostałe parametry - cechy JavaScript zdefiniowane w 6. edycji standardu ECMA-262 opublikowanego w czerwcu 2015 roku i opracowanego znacznie wcześniej, lepiej znanego jako ES6 lub ES2015. Widzieć:
To sprawia, że taki kod jest tak prosty, że grzechem jest go nie używać. W przypadku starych platform, które nie obsługują go natywnie, zawsze możesz użyć Babel lub innych narzędzi, aby przenieść go do starszej składni - i w rzeczywistości mój przykład transponowany przez Babel jest nadal krótszy i prostszy niż większość przykładów tutaj, ale tak nie jest naprawdę ważne, ponieważ efekt transpilacji nie jest czymś, co musisz zrozumieć lub utrzymać, to po prostu fakt, który wydałem mi się interesujący.
Wniosek
Nie ma potrzeby pisania setek linii kodu, który jest trudny w utrzymaniu i nie ma potrzeby używania całych bibliotek do tak prostej rzeczy, kiedy dwie linie zwykłego JavaScript mogą z łatwością wykonać zadanie. Jak widać, naprawdę opłaca się korzystać z nowoczesnych funkcji języka, aw przypadkach, gdy potrzebujesz obsługi archaicznych platform bez natywnego wsparcia dla nowoczesnych funkcji, zawsze możesz użyć Babel lub innych narzędzi do przeniesienia nowej składni do starej .
Nie koduj jak w 1995 roku
JavaScript ewoluuje i nie bez powodu. TC39 wykonuje niesamowitą robotę przy projektowaniu języka, dodając nowe funkcje, a dostawcy przeglądarek wykonują niesamowitą robotę, implementując te funkcje.
Aby zobaczyć aktualny stan natywnej obsługi dowolnej funkcji w przeglądarkach, zobacz:
Aby zobaczyć obsługę w wersjach Node, zobacz:
Aby używać nowoczesnej składni na platformach, które nie obsługują jej natywnie, użyj Babel: