簡體   English   中英

使用減少和過濾JavaScript在數組中查找數字模式

[英]Finding Mode of Numbers in Array With Reduce and Filter JavaScript

我有這個功能:

const mode = arr =>
  arr.reduce(
    (a,b,i,arr) => (arr.filter(c=> c === a).length >= arr.filter(c => c === b).length) ? a : b,  
    null
  )

console.log(mode([500, 450, 400, 400, 375, 350, 325, 300])) // 400

我可以看到reduce函數接受兩個參數,第一個為函數,第二個為null。 第一個參數函數將返回看起來像應該導致三元條件檢查的結果,如果返回的左數組大於或等於右邊的返回數組。

我仍然不太清楚引擎蓋下到底發生了什么,並希望有人可以以一種易於解釋的方式進一步分解這一點。 如果數組中的模式只有一個數字,這似乎是可行的,目前還可以,我以后可以解決這個問題。

是一個工作的Codepen進行測試。

該reduce函數從數組中獲取兩個元素,並將該函數應用於它們。 然后將其應用於結果和下一個元素,對arr所有元素依此類推。

該函數比較數組中“ a”和“ b”的出現次數,並返回出現次數最多的兩個。

出現次數是由filter(c => c === a) ,這意味着-返回僅包含等於a的元素的數組。

這樣,最后,您將獲得數組中大多數時間出現的值。

在您給出的示例中,發生以下情況:

  1. #of 500s vs #of 450s ==>產生500(因為>=
  2. #of 500s vs #of 400s ==>產生400(400次出現兩次)
  3. #of 400s vs #of 400s ==>產生400
  4. #of 400s vs #of 375s ==>產生400
  5. #of 400s vs #of 350s ==>產生400
  6. #of 400s vs #of 325s ==>產生400
  7. #of 400s vs #of 300s ==>產生400

最后,返回最后的結果。

arr.filter調用傳遞一個值,結果是一個僅包含該數字的數組。 對於原始數組中的所有項目,這將導致一個數組中只有一個項目,但400除外。400在該數組中是兩次。

每當具有累加器值的數組的長度大於具有當前值的數組的長度時,都會返回累加器。 初始累加器值為零,比較值是[]和[500],並且500成為累加器值。

然后比較將在[500]和[450]之間,累加器保持在500。下一個是400,比較將變為[500]和[400,400]。 當前值獲勝,累加器變為400。由於數組中沒有其他值出現兩次以上,因此reduce返回400。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM