JavaScript 專題之如何求陣列的最大值和最小值

冴羽發表於2017-07-19

JavaScritpt 專題系列第八篇,講解多種方式求陣列的最大值和最小值

前言

取出陣列中的最大值或者最小值是開發中常見的需求,但你能想出幾種方法來實現這個需求呢?

Math.max

JavaScript 提供了 Math.max 函式返回一組數中的最大值,用法是:

Math.max([value1[,value2, ...]])複製程式碼

值得注意的是:

  1. 如果有任一引數不能被轉換為數值,則結果為 NaN。
  2. max 是 Math 的靜態方法,所以應該像這樣使用:Math.max(),而不是作為 Math 例項的方法 (簡單的來說,就是不使用 new )
  3. 如果沒有引數,則結果為 -Infinity (注意是負無窮大)

而我們需要分析的是:

1.如果任一引數不能被轉換為數值,這就意味著如果引數可以被轉換成數字,就是可以進行比較的,比如:

Math.max(true, 0) // 1Math.max(true, '2', null) // 2Math.max(1, undefined) // NaNMath.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

既然是通過遍歷陣列求出一個最終值,那麼我們就可以使用 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])複製程式碼

eval

Math.max 支援傳多個引數來進行比較,那麼我們如何將一個陣列轉換成引數傳進 Math.max 函式呢?eval 便是一種

var arr = [6, 4, 1, 8, 2, 11, 23];
var max = eval("Math.max(" + arr + ")");
console.log(max)複製程式碼

apply

使用 apply 是另一種。

var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max.apply(null, arr))複製程式碼

ES6 …

使用 ES6 的擴充套件運算子:

var arr = [6, 4, 1, 8, 2, 11, 23];
console.log(Math.max(...arr))複製程式碼

有更多的方法歡迎留言哈~

專題系列

JavaScript專題系列目錄地址:github.com/mqyqingfeng…

JavaScript專題系列預計寫二十篇左右,主要研究日常開發中一些功能點的實現,比如防抖、節流、去重、型別判斷、拷貝、最值、扁平、柯里、遞迴、亂序、排序等,特點是研(chao)究(xi) underscore 和 jQuery 的實現方式。

如果有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。如果喜歡或者有所啟發,歡迎 star,對作者也是一種鼓勵。

來源:https://juejin.im/post/596ec3aaf265da6c39023524#comment

相關文章