JavaScritpt 專題系列第八篇,講解多種方式求數組的最大值和最小值git
取出數組中的最大值或者最小值是開發中常見的需求,但你能想出幾種方法來實現這個需求呢?github
JavaScript 提供了 Math.max 函數返回一組數中的最大值,用法是:數組
Math.max([value1[,value2, ...]])
值得注意的是:app
若是有任一參數不能被轉換爲數值,則結果爲 NaN。函數
max 是 Math 的靜態方法,因此應該像這樣使用:Math.max(),而不是做爲 Math 實例的方法 (簡單的來講,就是不使用 new )code
若是沒有參數,則結果爲 -Infinity
(注意是負無窮大)排序
而咱們須要分析的是:遞歸
1.若是任一參數不能被轉換爲數值,這就意味着若是參數能夠被轉換成數字,就是能夠進行比較的,好比:ip
Math.max(true, 0) // 1 Math.max(true, '2', null) // 2 Math.max(1, undefined) // NaN Math.max(1, {}) // NaN
2.若是沒有參數,則結果爲 -Infinity,對應的,Math.min 函數,若是沒有參數,則結果爲 Infinity,因此:開發
var min = Math.min(); var max = Math.max(); console.log(min > max);
瞭解了 Math.max 方法,咱們以求數組最大值的爲例,思考有哪些方法能夠實現這個需求。
最最原始的方法,莫過於循環遍歷一遍:
var arr = [6, 4, 1, 8, 2, 11, 23]; var result = arr[0]; for (var i = 1; i < arr.length; i++) { result = Math.max(result, arr[i]); } console.log(result);
既然是經過遍歷數組求出一個最終值,那麼咱們就能夠使用 reduce 方法:
var arr = [6, 4, 1, 8, 2, 11, 23]; function max(prev, next) { return Math.max(prev, next); } console.log(arr.reduce(max));
若是咱們先對數組進行一次排序,那麼最大值就是最後一個值:
var arr = [6, 4, 1, 8, 2, 11, 23]; arr.sort(function(a,b){return a - b;}); console.log(arr[arr.length - 1])
Math.max 支持傳多個參數來進行比較,那麼咱們如何將一個數組轉換成參數傳進 Math.max 函數呢?eval 即是一種
var arr = [6, 4, 1, 8, 2, 11, 23]; var max = eval("Math.max(" + arr + ")"); console.log(max)
使用 apply 是另外一種。
var arr = [6, 4, 1, 8, 2, 11, 23]; console.log(Math.max.apply(null, arr))
使用 ES6 的擴展運算符:
var arr = [6, 4, 1, 8, 2, 11, 23]; console.log(Math.max(...arr))
有更多的方法歡迎留言哈~
JavaScript專題系列目錄地址:https://github.com/mqyqingfeng/Blog。
JavaScript專題系列預計寫二十篇左右,主要研究平常開發中一些功能點的實現,好比防抖、節流、去重、類型判斷、拷貝、最值、扁平、柯里、遞歸、亂序、排序等,特色是研(chao)究(xi) underscore 和 jQuery 的實現方式。
若是有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。若是喜歡或者有所啓發,歡迎 star,對做者也是一種鼓勵。