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 相关文章推荐
javascript打开新窗口同时关闭旧窗口
Jan 16 Javascript
关于this和self的使用说明
Aug 01 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 Javascript
jQuery实现设置、移除文本框默认值功能
Jan 13 Javascript
jQuery弹出框代码封装DialogHelper
Jan 30 Javascript
微信小程序 Nginx环境配置详细介绍
Feb 14 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
Nov 24 Javascript
详解vue.js的事件处理器v-on:click
Jun 27 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
Oct 26 jQuery
vue视频播放插件vue-video-player的具体使用方法
Nov 08 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安装问题
2006/10/09 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
学习YUI.Ext第五日--做拖放Darg&Drop
2007/03/10 Javascript
javascript parseInt 函数分析(转)
2009/03/21 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
python Shapely使用指南详解
2020/02/18 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
python两种注释用法的示例
2020/10/09 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
2014道德模范事迹材料
2014/02/16 职场文书
电台实习生求职信
2014/02/25 职场文书
法人代表证明书范本
2015/06/18 职场文书
新闻通讯稿模板
2015/07/22 职场文书
Qt数据库应用之实现图片转pdf
2022/06/01 Java/Android
redis lua限流算法实现示例
2022/07/15 Redis