在 JavaScript 中操作陣列時,取得最大值和最小值是非常常見的需求。這篇文章將給出幾種對不同情境下的解決方案,幫助你在實作中選擇最適合的方式。
1. 手工轉循環 (最簡單)
最簡單的作法,通過一個轉循環進行比較,完全控制每步操作。
const numbers = [10, 5, 8, 12, 3];
let max = -Infinity;
let min = Infinity;
for (const num of numbers) {
if (num > max) max = num;
if (num < min) min = num;
}
console.log(`Max: ${max}, Min: ${min}`); // Max: 12, Min: 3
雖然此方法明確而直接,且不容易有額外錯誤。
2. 使用 Math.max.apply
和 Math.min.apply
(最方便)
另一種經典的用法是使用 apply
,將陣列傳入 Math.max
和 Math.min
。
const numbers = [10, 5, 8, 12, 3];
const max = Math.max.apply(null, numbers);
const min = Math.min.apply(null, numbers);
console.log(`Max: ${max}, Min: ${min}`); // Max: 12, Min: 3
這種方法在舊版瀏覽器中可能更具相容性,相較於使用 Math.max(…numbers) 更不容易出錯,較為推薦使用。
3. 使用 Math.max
和 Math.min
(最基礎方法,注意相容性)
在 JavaScript 中,Math.max
和 Math.min
是常用方法,通過將參數使用 …在 Math中展開來實踐。
const numbers = [10, 5, 8, 12, 3];
const max = Math.max(...numbers);
const min = Math.min(...numbers);
console.log(`Max: ${max}, Min: ${min}`); // Max: 12, Min: 3
使用擴展過程,可以讓數值陣列傳入這些方法作為個別值。
但要注意,這種作法不一定完全正確,實作上,可能因相容性問題,導致程式錯誤中斷的狀況,所以需要多留意。
4. 使用 reduce
使用 reduce
方法可以對陣列進行比較,以取得最大值和最小值。
const numbers = [10, 5, 8, 12, 3];
const max = numbers.reduce((a, b) => Math.max(a, b));
const min = numbers.reduce((a, b) => Math.min(a, b));
console.log(`Max: ${max}, Min: ${min}`); // Max: 12, Min: 3
此方法對大量資料的操作也非常優化。
注意:使用 reduce,在可讀性上比較差,與使用 forEach 相比,reduce 較耗效能,雖然單一對比上,感覺不太出來,但要留意大量使用 or 複雜度較高的情境下,有機會導致效能偏低或可讀性差,造成後續維護困難。
5. 使用排序 (需要暫存操作)
使用 sort
對陣列排序,最大值在最後,最小值在最前。
const numbers = [10, 5, 8, 12, 3];
const sorted = [...numbers].sort((a, b) => a - b);
const min = sorted[0];
const max = sorted[sorted.length - 1];
console.log(`Max: ${max}, Min: ${min}`); // Max: 12, Min: 3
但注意,此方法會使用暫存來複製陣列。
對於資料整理中,如果你是需要先將資料進行清整,這不失為一個方便的做法。
結論
上述法法都可以解決 JavaScript 中取得陣列最大值和最小值的需求。根據你的情境,可以選擇最適合的方案,希望這些方法對你有所幫助!
發表迴響