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 无法通过W3C验证的处理方法
Mar 09 Javascript
编写Js代码要注意的几条规则
Sep 10 Javascript
从零学jquery之如何使用回调函数
May 16 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
js实现带农历和八字等信息的日历特效
May 16 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
Apr 19 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
Vue 自定义指令实现一键 Copy功能
Sep 16 Javascript
Vue登录主页动态背景短视频制作
Sep 21 Javascript
前端使用crypto.js进行加密的函数代码
Aug 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/01/17 PHP
PHP 第二节 数据类型之数组
2012/04/28 PHP
php查询及多条件查询
2017/02/26 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
PHP7 list() 函数修改
2021/03/09 PHP
js 异步处理进度条
2010/04/01 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
Python制作刷网页流量工具
2017/04/23 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
Python探索之SocketServer详解
2017/10/28 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
办公室文员工作自我鉴定
2014/09/19 职场文书
检讨书范文1000字
2015/01/28 职场文书
人与自然观后感
2015/06/16 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书