如何使用JS,在一個Number
類型的數組裏,查找最大(或最小)數呢?算法
如下介紹五個方法。(若是有新方法,後續會更新,也歡迎各位留言提供新方法)數組
代碼以下:app
function findMax1 (arr) { let result = 0; if (Array.isArray(arr) && arr.length > 0) { for (let i = 0; i < arr.length; i++) { result = arr[i] > result ? arr[i] : result; } return result; } else { throw new ReferenceError('The parameter arr is invalid'); } }
解釋:函數
利用一個變量result
來存儲最大值。遍歷待查找的數組,若是當前遍歷的元素大於result
,就把這個元素賦值給result
。this
若是求最小值,將arr[i] > result ? arr[i] : result;
改爲arr[i] < result ? arr[i] : result;
。code
代碼以下:排序
function findMax2 (arr) { let result = 0; if (Array.isArray(arr) && arr.length > 0) { result = arr.reduce((a, b) => { return a > b ? a : b; }, 0); return result; } else { throw new ReferenceError('The parameter arr is invalid'); } }
解釋:it
reduce
方法就是經過一個函數,針對一個累加器(accumulator)和數組中的每個元素,將一個數組最終減小到一個值。io
reduce
接受兩個參數:function
第一個是callback
,就是那個前面提到的那個函數。它有四個參數:
accumulator
:累加器,它是上次運行callback
的結果。若是提供了initialValue
,那麼第一次就是initialValue
;currentValue
:當前遍歷的數組的元素;currentIndex
:當前遍歷的數組的元素的index,從0開始。若是提供了initialValue
,那就從1開始;array
:當前應用reduce
的數組。initialValue
,是一個初值,做爲第一次運行callback
函數的第一個實參。這個是可選的。這裏要注意一下,若是這個參數不提供,而且應用在一個空數組上,是會報錯的。 那麼上面代碼的意思就是,每次遍歷數組進行比較,大的就留下來,即accumulator
,並將其用做下一次和數組元素的比較。最後只留下這一個值,即最大值。
若是求最小值,將a > b ? a : b;
改爲 a < b ? a : b;
。
代碼以下:
function findMax3 (arr) { let result = 0; if (Array.isArray(arr) && arr.length > 0) { result = Math.max.apply(null, arr); return result; } else { throw new ReferenceError('The parameter arr is invalid'); } }
解釋:
apply
解釋稍顯複雜,不做進一步的解釋。
它接受兩個參數,第一個是thisArg
,第二個是argsArray
。兩個都是可選的。此處簡單來講,就是使用一個函數時,參數以數組的方式傳遞進去。
若是是求最小數,將Math.max()
改爲Math.min()
。
代碼以下:
function findMax4 (arr) { let result = 0; if (Array.isArray(arr) && arr.length > 0) { result = Math.max(...arr); return result; } else { throw new ReferenceError('The parameter arr is invalid'); } }
解釋:
基於上一個解法的思路,在ES6中,有一個擴展運算符(...),能夠將一個數組中的元素拆出來,組成一個用逗號分隔的序列。恰好知足Math.max()
函數的需求。
如上一種算法,若是是求最小數,將Math.max()
改爲Math.min()
。
function findMax5 (arr) { let result = 0; if (Array.isArray(arr) && arr.length > 0) { arr.sort((x, y) => y - x); result = arr[0]; return result; } else { throw new ReferenceError('The parameter arr is invalid'); } }
解釋:
經過Array.sort()方法將數組排序, 若是是求最大,就降序排列;若是是最小數,就升序排列。而後取第一個元素。
這裏須要注意的是,Array.sort()若是不傳任何參數,對整數的排序是有問題的,它只排第一位,也就是高位的順序,而不是整個整數的大小順序。好比[1, 34, 21, 4], 排序之後是[1, 21, 34, 4]。因此須要本身寫個比較算法。上面的例子是降序排列的例子。若是是升序,將(x, y) => y - x
改爲(x, y) => x - y
便可。