搜尋
首頁web前端前端問答es6怎麼求數組最大值

es6怎麼求數組最大值

Oct 27, 2022 pm 05:59 PM
javascriptes6es6數組

求數組最大值的方法:1、Math.max()配合apply()來求,語法「Math.max.apply(null,array);」;2、Math.max()配合擴充運算子「...」來求,語法「Math.max(...array);」;3、利用reduce()來求,語法「array.reduce((a,b)=>{return a=a>b?a:b});」。

es6怎麼求數組最大值

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

取數組的最大值的幾種方法

// 写法一:
Math.max.apply(null, [14, 3, 77, 30]);

// 写法二:
Math.max(...[14, 3, 77, 30]);

// 写法三:reduce
[14,3,77,30].reduce((accumulator, currentValue)=>{
    return accumulator = accumulator > currentValue ? accumulator : currentValue
});

這裡提供了三種寫法,前兩種用的都是Math. max()方法實作的,最後一種用了reduceAPI,下面會講到如何利用基本的Math.max()方法實作取數組的最大值,詳解apply方法在實例中的運用思想,以及reduceAPI的介紹與使用。

Math.max()


前兩種寫法用的都是Math.max()方法,這裡先介紹一下這個方法:

Math.max() 函數傳回一組數中的最大值。

用法:

Math.max(10, 20);   //  20
Math.max(-10, -20); // -10
Math.max(-10, 20);  //  20

注意是一組數中的最大值,不是一個陣列 的最大值,從上面的用法我們可以看到,參數不是一個數組,而是用逗號隔開的一組數,所以我們才不能直接使用該方法來實現取數組的最大值,而是做一些改進:

#apply方法和擴充運算子的使用


1、apply方法

前面講到我們不能直接用Math.max()方法來實現取數組的最大值,我們可以使用ES5的apply方法來實現。

這裡我們主要講為什麼用apply就可以實作取得陣列最大值

console.log(Math.max(1, 2, 344, 44, 2, 2, 333));

console.log(Math.max.call(null, 1, 2, 344, 44, 2, 2, 333));

console.log(Math.max.apply(null, [1, 2, 344, 44, 2, 2, 333]));

es6怎麼求數組最大值

#我們知道call() 方法是使用一個指定的this 值來呼叫一個函數,參數的傳遞和普通函數一樣。我們對Math.max使用call方法,第一個參數傳null,這樣使用就和原來的Math.max()一樣了,這當然還沒有實現獲取數組的最大值,但這是理解Math.max.apply(null, [14, 3, 77, 30]);寫法的第一步,也是關鍵一步。

Math.max()用的是參數列表,也就是一組數,我們的目標是一個數組,前面講到了call方法,那這裡不就剛好可以利用apply方法的差異性即:apply()方法接受的是參數陣列,來實現我們的需求。

所以,對Math.max使用apply方法,第一個參數傳null,第二個參數傳數組,這不就實現了我們的需求。

2、擴充運算子的使用

#前面我們講到了對Math.max()使用apply方法來實現功能,事實上,我們在手寫實現apply這個方法的時候,就對參數這個問題上做了特殊的處理,如何在apply內部將傳入的參數數組重新解構成參數列表?運用到ES6,我們使用了擴充運算符。

既然使用擴充運算子可以把參數數組解構為參數列表,那我們何不拿來用用,直接對Math.max()使用擴充運算子是實作取得數組最大值的另一個實作方式,而這個方式也讓獲得數組中的最大值變得更容易:

var arr = [1, 2, 3];
var max = Math.max(...arr); // 3

es6怎麼求數組最大值

reduce


使用reduce API實作取得數組最大值:

// reduce
[14,3,77,30].reduce((accumulator, currentValue)=>{
    return accumulator = accumulator > currentValue ? accumulator : currentValue
});

es6怎麼求數組最大值

reduce方法參數詳解

本文更想講一下reduce API的使用方法

reduce() 方法對數組中的每個元素執行一個由您提供的reducer函數(升序執行),將其結果匯總為單一回傳值。

需要專注的是該方法的參數:

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

概括一下就是reduce方法有兩個參數,一個是callback即你自己定義的reducer 函數,一個是initialValue即初始值。

在多數情況下,我們可能不會使用initialValue初始值這個參數,只用callback,但是initialValue初始值這個參數在reduce方法又很相關,所以我們必須清楚這個initialValue參數是乾嘛的,還有其他參數都是如何使用的。

下面我們來先說callback和initialValue這兩個參數。

  • callback:

    #

es6怎麼求數組最大值

callback 执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,注意这个:如果没有提供 initialValue则第一个值除外,你会发现initialValue在reduce方法中比较关键如果搞不清楚initialValue参数的意义,几乎很难去运用reduce方法。

callback函数又有四个参数,其中前三个参数也是十分关键的,和initialValue参数一样,需要搞清楚含义,分别是:accumulator,currentValue 和 index。

之所以说清楚reduce方法的几个关键参数是非常关键的,主要就在于,initialValue初始值有和没有这两种情况下,callback的三个参数(accumulator,currentValue 和 index)是不一样的。

  • initialValue:

initialValue参数 可选,这个参数作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

下面讲方法在执行过程中,callback的三个参数(accumulator,currentValue 和 index)是如何不一样的:

回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。

注意:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

这也是index参数里描述的:index 可选。是数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。

reduce方法如何运行

1.无初始值的情况

假如运行下段reduce()代码:

[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
  return accumulator + currentValue;
});

callback 被调用四次,每次调用的参数和返回值如下表:

es6怎麼求數組最大值

由reduce返回的值将是最后一次回调返回值(10)。

你还可以使用箭头函数来代替完整的函数。 下面的代码将产生与上面的代码相同的输出:

[0, 1, 2, 3, 4].reduce((prev, curr) => prev + curr );

2.有初始值的情况

如果你打算提供一个初始值作为reduce()方法的第二个参数,以下是运行过程及结果:

[0, 1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => {
    return accumulator + currentValue
}, 10)

es6怎麼求數組最大值

这种情况下reduce()返回的值是20。

reduce使用场景

reduce使用场景1.将二维数组转化为一维

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
  function(a, b) {
    return a.concat(b);
  },
  []
);
// flattened is [0, 1, 2, 3, 4, 5]

写成箭头函数的形式:

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
 ( acc, cur ) => acc.concat(cur),
 []
);

注意!!!上面这个例子,有初始值,初始值是一个空数组[]

concat()方法介绍:

concat() 方法用于合并两个或多个数组。

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);

console.log(array3);
// expected output: Array ["a", "b", "c", "d", "e", "f"]

连接两个数组

以下代码将两个数组合并为一个新数组:

var alpha = ['a', 'b', 'c'];
var numeric = [1, 2, 3];

alpha.concat(numeric);
// result in ['a', 'b', 'c', 1, 2, 3]

连接三个数组

以下代码将三个数组合并为一个新数组:

var num1 = [1, 2, 3],
    num2 = [4, 5, 6],
    num3 = [7, 8, 9];

var nums = num1.concat(num2, num3);

console.log(nums);
// results in [1, 2, 3, 4, 5, 6, 7, 8, 9]

reduce使用场景2.数组里所有值的和

var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) {
  return accumulator + currentValue;
}, 0);
// 和为 6

写成箭头函数的形式:

var total = [ 0, 1, 2, 3 ].reduce(
  ( acc, cur ) => acc + cur,
  0
);

注意,这里设置了初始值,为0,如果不这个初始值会怎么样呢?数组为空的时候,会抛错TypeError,再看一遍下面的描述:

如果数组为空且没有提供initialValue,会抛出TypeError 。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。

所以,在使用reduce时我们可以先判断一下数组是否为空,来避免这个问题。

【相关推荐:javascript视频教程编程视频

以上是es6怎麼求數組最大值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
React的生態系統的大小:瀏覽複雜的景觀React的生態系統的大小:瀏覽複雜的景觀Apr 28, 2025 am 12:21 AM

TonavigateReact'scomplexecosystemeffectively,understandthetoolsandlibraries,recognizetheirstrengthsandweaknesses,andintegratethemtoenhancedevelopment.StartwithcoreReactconceptsanduseState,thengraduallyintroducemorecomplexsolutionslikeReduxorMobXasnee

React如何使用密鑰有效地識別列表項目React如何使用密鑰有效地識別列表項目Apr 28, 2025 am 12:20 AM

RectuseSkeyStoeficelyListifyListIdifyListItemsbyProvidistableIdentityToeachelement.1)keysallowReaeActTotRackChangEsInListSwithouterSwithoutreThoutreTheenteringTheEntirelist.2)selectuniqueandstablekeys,避免使用

在React中調試與密鑰相關的問題:識別和解決問題在React中調試與密鑰相關的問題:識別和解決問題Apr 28, 2025 am 12:17 AM

KeysinrectarecrucialforOptimizingTherEnderingProcessandManagingDynamicListSefectefection.tospotaTandFixKey與依賴的人:1)adduniqueKeykeystoliquekeystolistItemStoAvoidWarningSwarningSwarningSwarningSperformance和2)useuniqueIdentifiersIdentifiersIdentifiersIdentifiersFromdatainSteAtofIndicessuessuessessemessuessessemessemessemesseysemessekeys,3)

React的單向數據綁定:確保可預測的數據流React的單向數據綁定:確保可預測的數據流Apr 28, 2025 am 12:05 AM

React的單向數據綁定確保數據從父組件流向子組件。 1)數據流向單一,父組件狀態變化可傳遞給子組件,但子組件不能直接影響父組件狀態。 2)這種方法提高了數據流的可預測性,簡化了調試和測試。 3)通過使用受控組件和上下文,可以在保持單向數據流的同時處理用戶交互和組件間通信。

在React組件中選擇和管理密鑰的最佳實踐在React組件中選擇和管理密鑰的最佳實踐Apr 28, 2025 am 12:01 AM

KeysinReactarecrucialforefficientDOMupdatesandreconciliation.1)Choosestable,unique,andmeaningfulkeys,likeitemIDs.2)Fornestedlists,useuniquekeysateachlevel.3)Avoidusingarrayindicesorgeneratingkeysdynamicallytopreventperformanceissues.

在React應用中使用USESTATE()優化性能在React應用中使用USESTATE()優化性能Apr 27, 2025 am 12:22 AM

USESTATE()ISCICIALFOROPTIMINECREACTAPPPERFORMACTACEUTOPACTONCACTONRE REDERSANDUPDATES.TOOPTIMIZE:1)USEUSECALLBACKTOMEMOEMOEIZEFUNCTIONSANDPREVENTUNNNNNNNNNNNNNNNNENESMARYRERER.2)limemememememoforcachingExpensiveComputations.3)

使用上下文和usestate()在組件之間共享狀態使用上下文和usestate()在組件之間共享狀態Apr 27, 2025 am 12:19 AM

使用Context和useState共享狀態是因為它們可以簡化大型React應用中的狀態管理。 1)減少propdrilling,2)代碼更清晰,3)更易管理全局狀態。但要注意性能開銷和調試複雜性,合理使用Context和優化技術可以提升應用的效率和可維護性。

不正確鍵對React虛擬DOM更新的影響不正確鍵對React虛擬DOM更新的影響Apr 27, 2025 am 12:19 AM

使用不正確的鍵會導致React應用程序中的性能問題和意外行為。 1)鍵是列表項的唯一標識符,幫助React高效地更新虛擬DOM。 2)使用相同或不唯一的鍵會導致列表項重新排序和組件狀態丟失。 3)使用穩定且唯一的標識符作為鍵可以優化性能,避免全量重渲染。 4)使用工具如ESLint來驗證鍵的正確性。正確使用鍵可以確保React應用的高效和可靠性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。