[英]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
的元素的數組。
這樣,最后,您將獲得數組中大多數時間出現的值。
在您給出的示例中,發生以下情況:
>=
) 最后,返回最后的結果。
arr.filter調用傳遞一個值,結果是一個僅包含該數字的數組。 對於原始數組中的所有項目,這將導致一個數組中只有一個項目,但400除外。400在該數組中是兩次。
每當具有累加器值的數組的長度大於具有當前值的數組的長度時,都會返回累加器。 初始累加器值為零,比較值是[]和[500],並且500成為累加器值。
然后比較將在[500]和[450]之間,累加器保持在500。下一個是400,比較將變為[500]和[400,400]。 當前值獲勝,累加器變為400。由於數組中沒有其他值出現兩次以上,因此reduce返回400。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.