JS中求數(shù)組中最大值匯總(持續(xù)更新)

如何使用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ù):

  1. 第一個(gè)是callback,就是那個(gè)前面提到的那個(gè)函數(shù)。它有四個(gè)參數(shù):
    1. accumulator:累加器残吩,它是上次運(yùn)行callback的結(jié)果财忽。如果提供了initialValue,那么第一次就是initialValue泣侮;
    2. currentValue:當(dāng)前遍歷的數(shù)組的元素即彪;
    3. currentIndex:當(dāng)前遍歷的數(shù)組的元素的index,從0開始活尊。如果提供了initialValue隶校,那就從1開始;
    4. array:當(dāng)前應(yīng)用reduce的數(shù)組酬凳。
  2. 第二個(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即可赁濒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市孟害,隨后出現(xiàn)的幾起案子流部,更是在濱河造成了極大的恐慌,老刑警劉巖纹坐,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舞丛,居然都是意外死亡耘子,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門球切,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谷誓,“玉大人,你說(shuō)我怎么就攤上這事吨凑『赐幔” “怎么了户辱?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)糙臼。 經(jīng)常有香客問(wèn)我庐镐,道長(zhǎng),這世上最難降的妖魔是什么变逃? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任必逆,我火速辦了婚禮,結(jié)果婚禮上揽乱,老公的妹妹穿的比我還像新娘名眉。我一直安慰自己,他們只是感情好凰棉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布损拢。 她就那樣靜靜地躺著,像睡著了一般撒犀。 火紅的嫁衣襯著肌膚如雪福压。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天绘证,我揣著相機(jī)與錄音隧膏,去河邊找鬼。 笑死嚷那,一個(gè)胖子當(dāng)著我的面吹牛胞枕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魏宽,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼腐泻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了队询?” 一聲冷哼從身側(cè)響起派桩,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚌斩,沒(méi)想到半個(gè)月后铆惑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送膳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年员魏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠聋。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撕阎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碌补,到底是詐尸還是另有隱情虏束,我是刑警寧澤棉饶,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站镇匀,受9級(jí)特大地震影響照藻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坑律,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一岩梳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晃择,春花似錦冀值、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至浪蹂,卻和暖如春抵栈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坤次。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工古劲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缰猴。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓产艾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親滑绒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闷堡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容