最近朋友面試,看到一題面試題給大家分享一下。
題目是:一個長度為10000左右的字符串數組 var = ['aaa','bbb','ccc'...]請寫出一個函數計算出現次數最多的字符串。
如果僅僅是用普通遍歷來做的話就很不優雅了。因為數組長度是10000左右
在網上看到了這樣一種方法 挺棒的。
function more(arr) {
let max=null;//定義一個用來存儲出現次數最多的元素
let num=1;//定義一個用來存儲最出現的次數
arr.reduce((p,k)=>{ //對該數組進行reduce遍歷
p[k]?p[k]++:p[k]=1;
if(p[k]>num){
num=p[k]
max=k
}
return p
},{})
return {max:max,num:num}//返回最多元素對象
}
要搞明白這個方法,首先要明白數組的reduce方法:
這個方法的思路是把整個數組轉化為一個偽數組對象:元素和出現的次數以鍵值對的方式存儲。
reduce的第二個參數是傳遞給函數的初始值,第一個參數是一個函數。那么此方法中第一次將{}傳遞給了p參數,k參數為當前遍歷的對象相當於Foreach中的item參數
最終得到的p對象: