最近朋友面试,看到一题面试题给大家分享一下。
题目是:一个长度为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对象: