SOFTELメモ

</> 技術者募集

【Javascript】配列の値の中から、最大値、最小値を求める(配列を引数に展開する)

問題

Javascriptで、数値の配列から、最大値、最小値を求めよ。

答え

var a = [3, 1, 4, 1, 5, 9, 2, 6];
Math.max.apply(null, a);  // → 9
Math.min.apply(null, a);  // → 1

補足

何が起きているのか。

Math.max(5, 7) // → 7
Math.max(5, 7, 4, 9, 1) // → 9 Math.max は可変長の引数をとります
Math.max([5, 7, 4, 9, 1]) // → NaN  そもそもダメです
Math.max.apply(null, [5, 7, 4, 9, 1]) // → 9 OKです

applyの第一引数は何でもよい。結果は変わらない。

Math.max.apply({}, [5, 7, 4, 9, 1]) // → 9 OKです
Math.max.apply([], [5, 7, 4, 9, 1]) // → 9 OKです
Math.max.apply(new Date(), [5, 7, 4, 9, 1]) // → 9 OKです
Math.max.apply(null, [5, 7, 4, 9, 1]) //→ 9 OKです

第一引数のオブジェクトにMath.maxを適用(apply)したところで、返ってくるのは Math.max(5, 7, 4, 9, 1) の結果。

言い換えると、applyは第1引数のオブジェクトをthisとして、第2引数の配列を引数に展開してmaxを実行するのだが、thisが何であれMath.max(5, 7, 4, 9, 1)の結果には影響しない。だから何を第1引数に渡してもよいけどnullか、素のオブジェクト{}が一番簡単。

配列を引数に展開したいときの方法でした。

参考

https://developer.mozilla.org/ja/A_re-introduction_to_JavaScript

関連するメモ

コメント