国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JS中取二維數組中最大值的方法匯總

2019-11-20 10:15:03
字體:
來源:轉載
供稿:網友

在JavaScript中可以通過內置的 Math.max() 的最大值,但是要從多重數組中取出最大值,還是有一定的難度。

問題描述

假設你有一個數組,而且這個數組中包含了數字的子數組,而我們要做的是從數組中的每個子數組中返回其最大的那個最大數。

基本解決方案

function largestOfFour(arr) {var results = []; // 創建一個results變量來存儲// 創建一個外層循環,遍歷外層數組for (var n = 0; n < arr.length; n++) {var largestNumber = 0; // 創建第二個變量,存儲最大的數// 創建另一個循環,遍歷子數組for (var sb = 0; sb < arr[n].length; sb++) {//檢查子數組的元素是否大于當前存儲的最大值if (arr[n][sb] > largestNumber) {// 如果為真,將這個值賦予給變量largestNumberlargestNumber = arr[n][sb];}}// 內部循環后,將每個子數組中的值保存到數組results中results[n] = largestNumber;}// 返回數組return results;}largestOfFour([[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]]); //[34, 456, 4567, 78]

上面的方法是一個普通的解決方案,通過兩個 for 循環對數組及其子數組做遍歷:

創建一個 results 變量用來存儲每個子數組中遍歷出來的最大值

創建外循環 for 遍歷外層數組

創建第二個變量 largestNumber 用來存放最大值。這個變量值必須放在內部 for 循環的外面,因為這樣他才不會被重新分配

創建第二個 for 循環,來遍歷子數組中的每個元素

通過一個 if 語句來判斷當前子數組的元素是否大于當前存儲的最大值 largestNumber 。如果是( true ),將這個最大值存儲給 largestNumber 。

內部循環結束后,將每個子數組中的最大值存儲到最初聲明的變量 results 中

最后返回 results 數組

取出所有子數組中的每個最大值之后,得到一個新數組 results ,這個時候只需要通:

Array.prototype.max = function () {return Math.max.apply({},this);}largestOfFour(arr).max();

就可以得到其中的最大值。

largestOfFour([[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]]).max(); // 4567

中級解決方案

function largestOfFour (arr) {// 通過map()方法,并通過回調函數,將子數組中最大值組合在一起,得到一新數組return arr.map(function (group) {// 通過reduce方法,把每個子數組中最大值返回到group數組中return group.reduce(function (prev, current) {// 如果current 大于prev,返回current,否則返回prevreturn (current > prev) ? current : prev;});});}largestOfFour([[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]]); // [34, 456, 4567, 78]

在外層數組中使用 Array.prototype.map() 方法遍歷數組。使用 map() 方法遍歷數組,會調用一個回調函數,在這個回調函數中,使用 reduce() 方法對每個子數組 group 進行合并,將值返回到一個新數組中。而在使用 reduce() 方法時,同樣會調用一個回調函數,這個回調函數只做了一件事情,就是子數組中的元素做為比較,如果 current 大于 prev ,將會返回 current ,否則返回 prev ,最終得到每個子數組中最大值。

和前面一樣,通過 Math.max.apply() 最終得到最大值。

最佳解決方案

function largestOfFour (arr) {return arr.map(Function.apply.bind(Math.max, null));}largestOfFour([[1,34],[456,2,3,44,234],[4567,1,4,5,6],[34,78,23,1]]); //[34, 456, 4567, 78]

這個方案,使用 Function.bind 方法創建一個特殊的回調函數,就類似于 Math.max 方法一樣,但其有一個 Function.prototype.apply 功能,將數組作為它的參數。

先對主數組中的每個元素做遍歷,也就是數組內部的每個子數組

使用 map() 方法需要一個回調函數,用來找出內部每個數組中的最大值。需要創建一個函數,讓 Math.max 能接受輸入的數組工作。換句話說,這是非常簡單而且這樣工作也非常的好,如 Math.max([9,43,20,6]); 將會返回最大值 43

Function.prototype.apply 方法工作可以接受數組做為參數,但函數通過調用上下文,這事情就有點復雜。例如 Math.max.apply(null,[9,43,20,6]) 將調用一個 Max.max 方法,但這樣的方法找起來不容易。

這里給 Function.prototype.apply 方法傳遞了一個 null 參數,告訴 Math.max 不需要任何上下文。

因為 arr.map() 需要一個回調函數,而不只是一個表達式,我們在 Function.bind 方法中提供了一個函數

因為 Function.prototype.apply 是一個靜態方法,類似一個函數對象,我們可以稱之為 Function.prototype.apply 上綁定了一個 Function.prototype.bind 。例如: Function.apply.bind

現在可以通過 Function.prototype.apply.bind 回調函數指定其上下文,比如在這個示例中的 Math.max 方法

由于是嵌入到 Function.prototype.apply 方法,需要一個上下文作為第一個參數,而且這個上下文還是一個虛假的。

所以我們將 null 作為第二個參數傳遞給 Function.prototype.apply.bind ,并且綁定一個上下文,這個上下文就是 Math.max 方法

由于 Math.max 是獨立于任何上下文的,所以它會忽略 Function.prototype.apply 方法調用的虛假上下文

我們使用 Function.prototype.apply.bind(Math.max,null) 讓一個新函數接受 arr.map 值,比如數組中的子數組

多維數組中取最大值

上文使用不同的方法實現了從二維數組中取出子數組中最大值,并且將這些最大值重新組成一個新數組,如果延伸一下,取出里面的最大值時,還需要使用 Array.prototype.max 函數,函數中通過 Math.max.apply({},this) 取得最大值。不過如果不是二維數組,那上述方法將無法取出數組中最大的值。

而在多維數組中取最大值,可以通過 join() 和 split() 方法組合在一起:

function largestOfFour (arr) {var newArray = arr.join(",").split(",");return Math.max.apply({},newArray);}largestOfFour([12,23]); // =>23largestOfFour([12,23,[1234,324],[345,566]]); // =>1234largestOfFour([12,23,[1234,324,[23121,90890]],[345,566,[345,78,90]]]); // =>90890largestOfFour([12,23,[1234,324,[23121,90890]],[345,566,[345,78,90,[90909090,988]]]]); // =>90909090

同樣可以使用類似的方法取出多維數組中的最小值:

function smallerOfFour (arr) {var newArray = arr.join(",").split(",");return Math.min.apply({},newArray);}smallerOfFour([12,23]); // =>12smallerOfFour([112,23,[1234,324],[345,566]]); // =>23smallerOfFour([212,123,[1234,324,[23121,90890]],[345,566,[345,78,90]]]); // =>78smallerOfFour([102,230,[1234,324,[23121,90890]],[345,566,[345,78,90,[90909090,988]]]]); // =>78

總結

在《 JavaScript學習筆記:取數組中最大值和最小值 》一文中介紹了使用 Math.max.apply({},arr) 來取數組中最大的數字。這篇文章中從不同的角度的介紹了如何在二維數組中取出最大的數,但很多時候,數組還有多維數組,文章最后介紹了如何實現多維數組中取出最大值。如果您有更多的方案,歡迎在評論中與我們一起分享。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘潭市| 临城县| 宁都县| 汉阴县| 兰坪| 三门县| 通化县| 拉孜县| 福贡县| 托克托县| 绩溪县| 阳原县| 玉林市| 东海县| 富源县| 富锦市| 乐至县| 赤城县| 南宫市| 南京市| 永修县| 南阳市| 当雄县| 成都市| 措勤县| 荔浦县| 辉县市| 图们市| 庆元县| 宁南县| 浦城县| 基隆市| 遂溪县| 客服| 黄石市| 乌恰县| 马鞍山市| 卢湾区| 无锡市| 喀喇沁旗| 伊通|