如何使用JS避消,在一個(gè)Number
類型的數(shù)組里,查找最大(或最姓偌小)數(shù)呢岩喷?
以下介紹五個(gè)方法。(如果有新方法监憎,后續(xù)會(huì)更新纱意,也歡迎各位留言提供新方法)
1. 不使用任何庫(kù)函數(shù)
代碼如下:
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');
}
}
解釋:
利用一個(gè)變量result
來(lái)存儲(chǔ)最大值。遍歷待查找的數(shù)組鲸阔,如果當(dāng)前遍歷的元素大于result
偷霉,就把這個(gè)元素賦值給result
。
如果求最小值褐筛,將arr[i] > result ? arr[i] : result;
改成arr[i] < result ? arr[i] : result;
类少。
2. 利用Array.reduce()
代碼如下:
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');
}
}
解釋:
reduce
方法就是通過(guò)一個(gè)函數(shù),針對(duì)一個(gè)累加器(accumulator)和數(shù)組中的每一個(gè)元素渔扎,將一個(gè)數(shù)組最終減少到一個(gè)值硫狞。
reduce
接受兩個(gè)參數(shù):
- 第一個(gè)是
callback
,就是那個(gè)前面提到的那個(gè)函數(shù)。它有四個(gè)參數(shù):-
accumulator
:累加器残吩,它是上次運(yùn)行callback
的結(jié)果财忽。如果提供了initialValue
,那么第一次就是initialValue
泣侮; -
currentValue
:當(dāng)前遍歷的數(shù)組的元素即彪; -
currentIndex
:當(dāng)前遍歷的數(shù)組的元素的index,從0開始活尊。如果提供了initialValue
隶校,那就從1開始; -
array
:當(dāng)前應(yīng)用reduce
的數(shù)組酬凳。
-
- 第二個(gè)是
initialValue
惠况,是一個(gè)初值,作為第一次運(yùn)行callback
函數(shù)的第一個(gè)實(shí)參宁仔。這個(gè)是可選的稠屠。這里要注意一下,如果這個(gè)參數(shù)不提供翎苫,并且應(yīng)用在一個(gè)空數(shù)組上权埠,是會(huì)報(bào)錯(cuò)的。
那么上面代碼的意思就是煎谍,每次遍歷數(shù)組進(jìn)行比較攘蔽,大的就留下來(lái),即accumulator
呐粘,并將其用作下一次和數(shù)組元素的比較满俗。最后只留下這一個(gè)值,即最大值作岖。
如果求最小值唆垃,將a > b ? a : b;
改成 a < b ? a : b;
。
3. 利用Apply和Math.max()
代碼如下:
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
解釋稍顯復(fù)雜痘儡,不作進(jìn)一步的解釋辕万。
它接受兩個(gè)參數(shù),第一個(gè)是thisArg
沉删,第二個(gè)是argsArray
渐尿。兩個(gè)都是可選的。此處簡(jiǎn)單來(lái)說(shuō)矾瑰,就是使用一個(gè)函數(shù)時(shí)砖茸,參數(shù)以數(shù)組的方式傳遞進(jìn)去。
如果是求最小數(shù)脯倚,將Math.max()
改成Math.min()
渔彰。
4. 只用Math.max()
代碼如下:
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');
}
}
解釋:
基于上一個(gè)解法的思路嵌屎,在ES6中,有一個(gè)擴(kuò)展運(yùn)算符(...)恍涂,可以將一個(gè)數(shù)組中的元素拆出來(lái)宝惰,組成一個(gè)用逗號(hào)分隔的序列。剛好滿足Math.max()
函數(shù)的需求再沧。
如上一種算法尼夺,如果是求最小數(shù),將Math.max()
改成Math.min()
炒瘸。
5. 利用Array.sort()排序
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');
}
}
解釋:
通過(guò)Array.sort()方法將數(shù)組排序, 如果是求最大淤堵,就降序排列;如果是最小數(shù)顷扩,就升序排列拐邪。然后取第一個(gè)元素。
這里需要注意的是隘截,Array.sort()如果不傳任何參數(shù)扎阶,對(duì)整數(shù)的排序是有問(wèn)題的,它只排第一位婶芭,也就是高位的順序东臀,而不是整個(gè)整數(shù)的大小順序。比如[1, 34, 21, 4], 排序以后是[1, 21, 34, 4]犀农。所以需要自己寫個(gè)比較算法惰赋。上面的例子是降序排列的例子。如果是升序呵哨,將(x, y) => y - x
改成(x, y) => x - y
即可赁濒。