読者です 読者をやめる 読者になる 読者になる

ぱんだのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

javascriptと最大値 ver. 2016 - オブジェクトの配列も -

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つかうとか)
しかし、スプレッド演算子を使うとこれが解決するんです.

  1. Map.values()でvalueの配列っぽいやつを取り出す (配列、ではないのが厄介)
  2. 空array内でスプレッド演算子を使い、配列もどきをarrayに変換
  3. arrayになったのでMath.maxをスプレッド演算子とともに使う
map1 = { 'obj1' => 1, 'obj2' => 2 }
Math.max(...[...map1.values()]) == 2