原生Math.max
方法
Math.max
方法不能接收陣列,可以使用ES6的...
將陣列打散
const arr = [111, 12, 111, 34, 2, 5, 76];
console.log(Math.max(...arr));
當然也可以用apply
方法呼叫
console.log(Math.max.apply(null, arr));
遍歷獲取最大值
遍歷陣列,依次比較,儲存較大的數,最終得到的就是最大值,這裡使用forEach
遍歷
function max2(arr) {
let result = -Infinity;
arr.forEach((item) => {
if (item > result) {
result = item;
}
});
return result;
}
console.log(max2(arr));
利用排序獲取最大值
將陣列使用sort
方法排序後,第一個元素或最後一個元素就是最大值,再用shift
或者pop
方法取出(由升序還是降序決定),值得注意的是這兩個方法會修改原陣列,可以使用slice
方法複製一份陣列再執行彈出元素操作
function max3(arr) {
return arr.sort((a, b) => a - b).slice().pop();
}
console.log(max3(arr));
使用filter
排除小的值
使用filter
函式依次取出<
自身的元素,當取不出元素即返回的函式長度===
零時,就取得了最大值,至於為什麼用遞迴不用迴圈,用IIFE不用先宣告後使用,嗯,就是單純的不想
(function greater(arr, idx) {
const res = arr.filter(item => item > arr[idx]);
if (res.length === 1) {
console.log(res[0]);
return res[0];
}
greater(arr, idx + 1);
})(arr, 0);
使用every
判斷自己是否是最大值
使用every
的原理和使用filter
的原理類似,即當所有元素都<=
本身的時候,本身就是最大值
(function greater(arr, idx) {
if (arr.every(item => item <= arr[idx])) {
console.log(arr[idx]);
return arr[idx];
}
greater(arr, idx + 1);
})(arr, 0);
使用遞迴模擬陣列方法
和上面兩個方法類似,只是內層用了遞迴和IIFE模擬every
(function outer(arr, i) {
let flag = function inner(arr, j) {
if (arr[j] <= arr[i]) {
return false;
}
return arr.length < j + 1 ? inner(arr, j + 1) : true;
}(arr, 0);
if (flag) {
console.log(arr[i - 1]);
return arr[i - 1];
}
outer(arr, i + 1);
})(arr, 0);
友情提示
前面幾種方法相對比較簡潔,工作中比較常用,後邊三種比較適合身子骨比較硬、頭比較鐵的碼農僅供學習、娛樂,切莫當真(狗頭保命)。