2017 Güncellemesi: vanilla JS ile 2 satırlı yanıt
Burada cevapların tamamı vardır aşırı karmaşık çoğu 20 kod satırları, hatta daha fazla sürebilir.
Bu örnek yalnızca iki satır vanilya JavaScript kullanır , lodash, alt çizgi veya diğer kitaplıklar içermez:
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;
Güncelleme:
Bu da aynı fakat izleyin kesinlikle için geliştirilmiş olan Airbnb JavaScript Stil Kılavuzu'na - kullanılarak, onaylanmış, ESLint ile eslint-config-airbnb-baz :
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);
Orijinal kodla ilgili linter problemlerini bana bildirdiği için ZuBB'ye özel teşekkürler .
Misal
Bu, sorunuzun tam örneğidir:
let output = cartesian([1,2],[10,20],[100,200,300]);
Çıktı
Bu, bu komutun çıktısıdır:
[ [ 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
Demoları görün:
Sözdizimi
Burada kullandığım sözdizimi yeni bir şey değil. Örneğim, Haziran 2015'te yayınlanan ve çok daha önce geliştirilmiş olan ve daha çok ES6 veya ES2015 olarak bilinen ECMA-262 standardının 6. baskısında tanımlanan JavaScript özellikleri olan yayma işleci ve dinlenme parametrelerini kullanır. Görmek:
Kodu bu kadar basitleştirir ki kullanmamak günahtır. Yerel olarak desteklemeyen eski platformlar için, onu eski sözdizimine dönüştürmek için her zaman Babel veya diğer araçları kullanabilirsiniz - ve aslında Babel tarafından aktarılan örneğim buradaki örneklerin çoğundan daha kısa ve daha basittir, ancak bu gerçekten önemli çünkü aktarımın çıktısı anlamanız veya sürdürmeniz gereken bir şey değil, sadece ilginç bulduğum bir gerçek.
Sonuç
Bakımı zor olan yüzlerce satır kod yazmaya gerek yoktur ve iki satır vanilya JavaScript işi kolayca halledebilirken, bu kadar basit bir şey için tüm kitaplıkları kullanmaya gerek yoktur. Gördüğünüz gibi, dilin modern özelliklerini kullanmak gerçekten işe yarıyor ve modern özelliklerin yerel desteği olmadan arkaik platformları desteklemeniz gereken durumlarda, yeni sözdizimini eskisine dönüştürmek için her zaman Babel veya diğer araçları kullanabilirsiniz. .
1995'miş gibi kodlama
JavaScript gelişir ve bunu bir nedenden dolayı yapar. TC39, yeni özellikler ekleyerek dil tasarımında harika bir iş çıkarıyor ve tarayıcı satıcıları bu özellikleri uygulamak için harika bir iş çıkarıyor.
Tarayıcılardaki herhangi bir özelliğin mevcut yerel destek durumunu görmek için bkz:
Düğüm sürümlerinde desteği görmek için bkz:
Modern sözdizimini yerel olarak desteklemeyen platformlarda kullanmak için Babel'i kullanın: