Javascript面试经典套路reduce函数查重


Posted in Javascript onMarch 23, 2017

今天在偶然间查看到了一段代码,代码使用了很短的篇幅完成了字符串统计相同字符次数这个经典面试题,其中用到了reduce这个方法,网上查了查,没有查到什么有价值的东西,导致浪费了我一些时间才看懂,现将我的思路整理如下:

原代码:

var arr="qweqrq"
var info= arr.split('').reduce((a,b)=>
 (a[b]++ || (a[b]=1),a)
,{})
console.log(info)

代码思路是这样的,先将字符串arr通过split方法切割成数组,然后使用reduce,这个方法干了什么呢,分为这几步:

1.首先reduce会接收一个callback来对数组里的每一个元素执行,如果有第二个参数如上例:{}。,那么callback将会使用这个{}作为参数来和数组中的第一个元素一同传入callback;

2.传入参数之后,会进行一个与门短路操作,也可以叫默认值操作,当a[b]++成真,则返回a[b]。而这里的a为{},b为"q",很明显a中并没有b,执行a[b]=1,那么就会给a[b]赋值为1,后面是一个逗号表达式,所以会返回有了a[b]:1这样属性的a对象;

与门短路操作:如果第一个操作数的值为true,进行短路操作,直接产生第一个操作数的值。如果为false,则产生第二个操作数的值。

逗号表达式:逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n。逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。

3.之后要说下reduce函数,它可以将之前一次执行后返回的结果作为参数继续和之后的元素一同传入callback执行,相当于fn(fn(fn(fn(a,b),c),d),e),fn即为callback;

4.在本例中,因为有第二个参数{}传入,所以callback执行了6次。相当于对数组中每一个元素都进行了录入和查重操作,比如当callback运行到第四次,这时的a是{q:1,w:1,e:1},执行callback,a[b]即a['q']存在,执行a['q']++,a['q']值为2,以此类推,最后得到的就是一个以数组每个元素为属性名,出现次数为属性值的对象。

需要注意的是,reduce是es5推出的方法,ie8及以下都不兼容。

以上所述是小编给大家介绍的Javascript面试经典套路reduce函数查重,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
基于jquery ajax 用户无刷新登录方法详解
Apr 28 Javascript
jquery解析xml字符串简单示例
Apr 11 Javascript
javascript实现的简单计时器
Jul 19 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
js实现楼层效果的简单实例
Jul 15 Javascript
canvas实现探照灯效果
Feb 07 Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 Javascript
JS数组去重常用方法实例小结【4种方法】
May 28 Javascript
详解Vue-Router源码分析路由实现原理
May 15 Javascript
vuex实现像调用模板方法一样调用Mutations方法
Nov 06 Javascript
vue实现的封装全局filter并统一管理操作示例
Feb 02 Javascript
JavaScript实现简单拖拽效果
Sep 15 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
Mar 23 #jQuery
vue.js实现含搜索的多种复选框(附源码)
Mar 23 #Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
Mar 23 #Javascript
JS实现两周内自动登录功能
Mar 23 #Javascript
面试常见的js算法题
Mar 23 #Javascript
Vue.Js中的$watch()方法总结
Mar 23 #Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 #Javascript
You might like
让PHP支持页面回退的两种方法
2008/01/10 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
Javascript中的数学函数
2007/04/04 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
Angular路由简单学习
2016/12/26 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
python实现统计代码行数的小工具
2019/09/19 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
Python多线程获取返回值代码实例
2020/02/17 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
初中女生自我鉴定
2013/12/19 职场文书
成人继续教育实施方案
2014/03/01 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
工作作风懒散检讨书
2014/10/29 职场文书
2014年外联部工作总结
2014/11/17 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
北京英语导游词
2015/02/12 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript