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 实现的全选和反选
Apr 15 Javascript
javascript实现3D变换的立体圆圈实例
Aug 06 Javascript
javascript实现数组去重的多种方法
Mar 14 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
node.js express中app.param的用法详解
Jul 16 Javascript
JQ图片文件上传之前预览功能的简单实例(分享)
Nov 12 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
Dec 18 jQuery
vue 实现滚动到底部翻页效果(pc端)
Jul 31 Javascript
layer.js open 隐藏滚动条的例子
Sep 05 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
vue实现打地鼠小游戏
Aug 21 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计算数组不为空元素个数的方法
2014/01/27 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP最常用的正则表达式
2017/02/13 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
PHP创建对象的六种方式实例总结
2019/06/27 PHP
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
2014/01/23 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
python代码能做成软件吗
2020/07/24 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
化学实验员岗位职责
2013/12/28 职场文书
师德学习感言
2014/01/31 职场文书
七一讲话心得体会
2014/09/05 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
合同审查法律意见书
2015/06/04 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang