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 相关文章推荐
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
Apr 27 Javascript
基于jquery实现点击左右按钮图片横向滚动
Apr 11 Javascript
JavaScript instanceof 的使用方法示例介绍
Oct 23 Javascript
纯js实现无限空间大小的本地存储
Jun 18 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
Sep 18 Javascript
基于jQuery实现简单的折叠菜单效果
Nov 23 Javascript
Angular.js与Bootstrap相结合实现手风琴菜单代码
Apr 13 Javascript
微信小程序 LOL 英雄介绍开发实例
Sep 30 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
Sep 13 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
Sep 28 Javascript
基于Vue实现可以拖拽的树形表格实例详解
Oct 18 Javascript
Javascript读写cookie的实例源码
Mar 16 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各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP7多线程搭建教程
2017/04/21 PHP
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
vue router 配置路由的方法
2018/07/26 Javascript
如何使用vuex实现兄弟组件通信
2018/11/02 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
在Django框架中编写Contact表单的教程
2015/07/17 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
HTML5的结构和语义(5):内嵌媒体
2008/10/17 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
三万活动总结
2014/04/28 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
残联2016年全国助残日活动总结
2016/04/01 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
Hive日期格式转换方法总结
2022/06/25 数据库