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 相关文章推荐
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
Nov 30 Javascript
25个非常棒的jQuery滑块插件和教程小结
Sep 02 Javascript
jquery中使用ajax获取远程页面信息
Nov 13 Javascript
js判断某个方法是否存在实例代码
Jan 10 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
JavaScript实现url参数转成json形式
Sep 25 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
Apr 09 Javascript
JavaScript中条件语句的优化技巧总结
Dec 04 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
一个颜色轮换的简单例子
2006/10/09 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
js初始化验证实例详解
2016/11/26 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
2019/06/03 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
python求列表交集的方法汇总
2014/11/10 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
艺术设计专业个人求职信
2013/09/21 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
村党建工作汇报材料
2014/11/02 职场文书
立项申请报告范本
2015/05/15 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书