Math.max()が基本
最近増えた便利記法: スプレッド演算子 (...)
Math.max()
引数の最大値を返します.
引数: 数字 (カンマ区切り, 配列不可)
Math.max(1,2,4,7,3) == 7
配列の最大値
新しい方法
スプレッド演算子 (...) を利用.
ES6から登場したスプレッド演算子は、配列 (正確に言うとiterable) が引数にある時、それを展開してくれる.
Math.max(...[1,2,7,3]) == Math.max(1,2,7,3)
超簡単、ES6は最高だぜ!!
古い方法
※ 読まなくても覚えなくてもいいよ!
apply()を利用.
apply:
function.prototype.apply(thisArg, ArgList)
関数の実行時に、thisを書き換える関数.
引数はListに入れて渡し、渡された関数ではf(L[0], L[1], ...)と展開(?)される
なので、本来配列を引数に取れないmax()に配列を渡せる
Math.max.apply(null, [1,2,7,3]) ≒ Math.max(1,2,7,3)
objectの配列における最大値
objectのあるpropertyについて最大値をとりたい場合.
素直なやり方
for of loopを使い、obj.prop と 変数 max_propを比較、みたいなやり方
ワンラインでポン
objectの配列⇒obj.propの配列⇒max(...prop)
がすっきりするね.
objectの配列から、propertyの配列を作る方法: map()
map:
array.prototype.map(callback)
配列の各要素に対してcallbackを実行し、callbackの引数から新しい配列を作成.
callbackの引数は (value, index, array, thisArg)
arrow functionを使うとcallbackがすごい短くなるよ、やったね!!
let list = [{ "id": "Zenigame", "value": 1 }, { "id": "fushigidane", "value": 4 }, { "id": "hitokage", "value": 7 }, { "id": "pikachu", "value": 2 }, ]; Math.max(...list.map(obj => obj.value)) == 7
Mapオブジェクトの最大値
ES6から登場したMapオブジェクト (array.map()とは違うよ)
これ、非常に使い勝手がいい, が, 最大値をとるのがちょっと手間 (for of loopつかうとか)
しかし、スプレッド演算子を使うとこれが解決するんです.
- Map.values()でvalueの配列っぽいやつを取り出す (配列、ではないのが厄介)
- 空array内でスプレッド演算子を使い、配列もどきをarrayに変換
- arrayになったのでMath.maxをスプレッド演算子とともに使う
map1 = { 'obj1' => 1, 'obj2' => 2 } Math.max(...[...map1.values()]) == 2