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 相关文章推荐
json跟xml的对比分析
Jun 10 Javascript
JQuery文字列表向上滚动的代码
Nov 13 Javascript
js转化毫秒为时间格式代码
Apr 10 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
Oct 16 Javascript
jQuery实现在列表的首行添加数据
May 19 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
May 28 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
bootstrap table实现单击单元格可编辑功能
Mar 28 Javascript
手把手搭建安装基于windows的Vue.js运行环境
Jun 12 Javascript
JS实现留言板功能
Jun 17 Javascript
浅谈原生JS中的延迟脚本和异步脚本
Jul 12 Javascript
JQuery animate动画应用示例
May 14 jQuery
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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
一个用于MySQL的PHP XML类
2006/10/09 PHP
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
JavaScript的Cookies
2008/01/16 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
Bootstrap实现模态框效果
2019/09/30 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
java遇到微信小程序 "支付验证签名失败" 问题解决
2019/12/22 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
Python类的多重继承问题深入分析
2014/11/09 Python
Python中for循环和while循环的基本使用方法
2015/08/21 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
对Python中range()函数和list的比较
2018/04/19 Python
对python 自定义协议的方法详解
2019/02/13 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python读取YAML文件过程详解
2019/12/30 Python
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
初中同学会活动方案
2014/08/22 职场文书
成都人事代理协议书
2014/10/25 职场文书
小班下学期个人总结
2015/02/12 职场文书
2016国培学习心得体会
2016/01/08 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python