JS中求數組最大(最小)值彙總(持續更新)

如何使用JS,在一個Number類型的數組裏,查找最大(或最小)數呢?算法

如下介紹五個方法。(若是有新方法,後續會更新,也歡迎各位留言提供新方法)數組

1. 不使用任何庫函數

代碼以下: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,就把這個元素賦值給resultthis

若是求最小值,將arr[i] > result ? arr[i] : result;改爲arr[i] < result ? arr[i] : result;code

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');
    }
}

解釋:it

reduce方法就是經過一個函數,針對一個累加器(accumulator)和數組中的每個元素,將一個數組最終減小到一個值。io

reduce接受兩個參數:function

  1. 第一個是callback,就是那個前面提到的那個函數。它有四個參數:

    1. accumulator:累加器,它是上次運行callback的結果。若是提供了initialValue,那麼第一次就是initialValue
    2. currentValue:當前遍歷的數組的元素;
    3. currentIndex:當前遍歷的數組的元素的index,從0開始。若是提供了initialValue,那就從1開始;
    4. array:當前應用reduce的數組。
  2. 第二個是initialValue,是一個初值,做爲第一次運行callback函數的第一個實參。這個是可選的。這裏要注意一下,若是這個參數不提供,而且應用在一個空數組上,是會報錯的。

那麼上面代碼的意思就是,每次遍歷數組進行比較,大的就留下來,即accumulator,並將其用做下一次和數組元素的比較。最後只留下這一個值,即最大值。

若是求最小值,將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解釋稍顯複雜,不做進一步的解釋。

它接受兩個參數,第一個是thisArg,第二個是argsArray。兩個都是可選的。此處簡單來講,就是使用一個函數時,參數以數組的方式傳遞進去。

若是是求最小數,將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');
    }
}

解釋:

基於上一個解法的思路,在ES6中,有一個擴展運算符(...),能夠將一個數組中的元素拆出來,組成一個用逗號分隔的序列。恰好知足Math.max()函數的需求。

如上一種算法,若是是求最小數,將Math.max()改爲Math.min()

利用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');
    }
}

解釋:

經過Array.sort()方法將數組排序, 若是是求最大,就降序排列;若是是最小數,就升序排列。而後取第一個元素。

這裏須要注意的是,Array.sort()若是不傳任何參數,對整數的排序是有問題的,它只排第一位,也就是高位的順序,而不是整個整數的大小順序。好比[1, 34, 21, 4], 排序之後是[1, 21, 34, 4]。因此須要本身寫個比較算法。上面的例子是降序排列的例子。若是是升序,將(x, y) => y - x改爲(x, y) => x - y便可。

相關文章
相關標籤/搜索