2017-10-11 13 views
2

私が書いた各配列関数のこの最大のforループを避ける方法があるかどうかは、ES6(私はかなり新しくES6に慣れています)を使って私のアルゴリズム知識を改善していますか?forループを回避する方法はありますか? (ES6/JavaScript)

function largestEach(arr) { 
    for(const [i,v] of arr.entries()) 
     arr[i] = v.sort((a,b) => b - a).filter((e,i) => i === 0); 
    return arr.reduce((a,b) => a.concat(b)); 
} 
largestEach([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 

コンソールログ:[5, 27, 39, 1001]が正しいです。

私はそれを使用している実際のユースケースがないので、概念的です。私は、私のより良い選択肢がES6(または一般的にJS)にあったかどうか不思議なループには反対していません。純粋に不思議!

+4

'arr.map返す(V => Math.maxを(。 ..v)); ' – 4castle

+0

私は@ 4castleと同じものを思いついた。いずれかの内部配列が空であれば、 '-Infinity'の結果が得られます。これは、その場合の質問の関数よりも優れています(出力が空の配列を単にスキップして、入力とは異なる長さの配列)。 – nnnnnn

+0

@ 4castleだから...普及構文は基本的にそのサブ配列を展開し、最大値だけを返す...興味深い! – simplexity

答えて

4

あなたは、単に.map()を使用することができます。基本的にはあなたのforループはこれに相当します。次のことが面白いのthatsしかし

arr = arr.map(elem => elem.sort((a, b) => b - a).filter(e,i) => i === 0) 

あなたはこのケースでソート関数を指定する必要がないことです。また、.filter(e,i) => i === 0)ではなく、.pop()または[0]を使用します。

ですから、書き換えることができます:

arr = arr.map(elem => elen.sort()[0]) 

次のあなたの全体の機能書き換えることができますので、あなたは、Math.maxを使用することができます。

function largestEach(arr) { 
    return arr.map(e => Math.max(...e)) 
} 
+1

@ some- [* spread operator *](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)はありません。 ;-) – RobG

+0

デフォルトでは要素lexicographical:console.log([10、9、20] .sort()) 'が格納されているので、カスタムソートコールバックが必要です。 –

+0

@ some-Mozillaは、寄稿者が行うMDNのコンテンツを作成しません。誰でも貢献者になれる(はい、私はとても活発ではありません)、ちょうどアカウントを作成して、離れて行ってください。 '...'は、スプレッドとレスト構文で同じように使われる[* punctuator *](http://ecma-international.org/ecma-262/8.0/#sec-punctuators)です;'; 'はステートメントを定義するために使われますしかし、それは "ステートメント演算子"と呼ばれていません。 ;-) – RobG

2
function largestEach(arr) { 
    return arr.map(a => a.reduce((a, b) => Math.max(a, b))); 
} 
2
function largestEach(arr) { 
    return arr.map((a)=> Math.max.apply(null, a)) 
} 
+0

これは最速の解決策です。 –

+0

@ PanosK.Itが最も速いかもしれませんが、配列が大きい場合はスタックオーバーフローでクラッシュします。 – some

+0

@ someどのくらいの大きさですか? –

関連する問題