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实现简单验证码提示解决方案
Dec 20 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
在网页中插入百度地图的步骤详解
Dec 02 Javascript
js实现文字选中分享功能
Jan 25 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
Mar 06 Javascript
ES6中Proxy代理用法实例浅析
Apr 06 Javascript
详解vue.js的devtools安装
May 26 Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 Javascript
angularjs获取到My97DatePicker选中的值方法
Oct 02 Javascript
js module大战
Apr 19 Javascript
Vue+Java+Base64实现条码解析的示例
Sep 23 Javascript
解决vant-UI库修改样式无效的问题
Nov 03 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/10/11 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
JavaScript效率调优经验
2009/06/04 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
用Javascript评估用户输入密码的强度(Knockout版)
2011/11/30 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
英文求职信结束语大全
2013/10/26 职场文书
班队活动设计方案
2014/01/30 职场文书
小学五年级学生评语
2014/04/22 职场文书
殡葬服务心得体会
2014/09/11 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
写给老师的感谢信
2015/01/20 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
加薪申请报告范本
2015/05/15 职场文书
农村老人去世追悼词
2015/06/23 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
golang switch语句的灵活写法介绍
2021/05/06 Golang
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
SpringBoot快速入门详解
2021/07/21 Java/Android