はじめに
js で最大値取得時に注意する点の備忘録です。(最小値も同様)
詳細
const array = [1, 3, 5, 4, 2]
Math.max(...array) // 5
// 配列を与えると NaN を返すので、上記のようにスプレッド構文を使用
Math.max(array) // NaN
しかし、要素の数が多い大規模な配列では、スプレッド構文 (...) と apply のどちらも、失敗するか誤った値を返す可能性があります。なぜなら、配列の要素を関数の引数として渡そうとしているからです。
MDN web docs: Function.prototype.apply()から引用↓
しかし注意してください。この方法で apply を使う場合、JavaScript エンジンの引数の長さ上限を超えてしまう危険があります。
多すぎる (おおよそ数万個以上だと思って下さい) 引数を与えた結果は、その上限が特に決まっていない (本当に任意の巨大なデータのかたまりに対してさえ) ためエンジンによって (JavaScriptCore ライブラリでは引数の上限は65536であるとハードコーディングされています) 異なります。例外を投げるエンジンも存在します。
さらに酷い場合では、関数へ実際に渡す引数の数を勝手に制限するものもあります
解決策:reduce()を使用
const getBig = function (a, b) {return Math.max(a, b);}
let array = [5, 2, 3, 1, 10];
let max = array.reduce(getBig); // => 10
ちなみに python の場合
maxValue = max(array)