給定一個數組array求最大值和最小值:
1.一般做法:
算法1的主要思想是在自定義的min()函數和max()函數中,通過循環由第一個值依次與后面的值作比較,動態更新最大值和最小值,從而找到結果
// 最小值 Array.prototype.min = function() { var min = this[0]; var len = this.length; for (var i = 1; i < len; i++){ if (this[i] < min){ min = this[i]; } } return min; }; //最大值 Array.prototype.max = function() { var max = this[0]; var len = this.length; for (var i = 1; i < len; i++){ if (this[i] > max) { max = this[i]; } } return max; };
2.借助Math對象的min()函數和max()函數
算法2的主要思想是通過apply()函數改變函數的執行體,將數組作為參數傳遞給apply()函數。這樣數組就可以直接調用Math對象的min()函數和max()函數來獲取返回值
// 最大值 Array.max = function(array) { return Math.max.apply(Math, array); }; // 最小值 Array.min = function(array) { return Math.min.apply(Math, array); };
3.優化上面做法:
在算法2中將min()函數和max()函數作為Array類型的靜態函數,但並不支持鏈式調用,我們可以利用對象字面量進行簡化。
// 最大值 Array.prototype.max = function() { return Math.max.apply({}, this); }; // 最小值 Array.prototype.min = function() { return Math.min.apply({}, this); };
上面的算法代碼中apply()函數傳入的第一個值為{},實際表示當前執行環境的全局對象。第二個參數this指向需要處理的數組。
由於apply()函數的特殊性,我們還可以得到其他幾種實現方法。將apply()函數的第一個參數設置為null、undefined或{}都會得到相同的效果。
4. 借助Array類型的reduce()函數
主要思想是reduce()函數不設置initialValue初始值,將數組的第一個元素直接作為回調函數的第一個參數,依次與后面的值進行比較。當需要找最大值時,每輪累加器返回當前比較中大的值;當需要找最小值時,每輪累加器返回當前比較中小的值
// 最大值 Array.prototype.max = function () { return this.reduce(function (preValue, curValue) { return preValue > curValue ? preValue : curValue; // 比較后,返回大的值 }); }; // 最小值 Array.prototype.min = function () { return this.reduce(function (preValue, curValue) { return preValue > curValue ? curValue : preValue; // 比較后,返回小的值 }); };
5. 借助Array類型的sort()函數
主要思想是借助數組原生的sort()函數對數組進行排序,排序完成后首尾元素即是數組的最小、最大元素。
默認的sort()函數在排序時是按照字母順序排序的,數字都會按照字符串處理,例如數字11會被當作"11"處理,數字8會被當作"8"處理。在排序時是按照字符串的每一位進行比較的,因為"1"比"8"要小,所以"11"在排序時要比"8"小。對於數值類型的數組來說,這顯然是不合理的,所以需要我們自定義排序函數。
var sortFn = function (a, b) { return a - b; }; var arr5 = [2, 4, 10, 7, 5, 8, 6]; var sortArr = arr5.sort(sortFn); // 最小值 console.log(sortArr[0]); // 2 // 最大值 console.log(sortArr[sortArr.length - 1]); // 10 得到數組的最小值為“2”,最大值為“10”。
6.借助ES6的擴展運算符
算法6的主要思想是借助於ES6中增加的擴展運算符(...),將數組直接通過Math.min()函數與Math.max()函數的調用,找出數組中的最大值和最小值。
根據以上的分析,得到以下的代碼。
var arr6 = [2, 4, 10, 7, 5, 8, 6]
// 最小值
console.log(Math.min(...arr6));
// 最大值
console.log(Math.max(...arr6));
得到數組的最小值為“2”,最大值為“10”。
一共講解了6種求數組中最大值和最小值的方法。實際運用時推薦算法3,如果追求代碼的簡潔,推薦算法6,不過它需要ES6提供支持。