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 相关文章推荐
javascript预览上传图片发现的问题的解决方法
Nov 25 Javascript
js 实现的可折叠留言板(附源码下载)
Jul 01 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
Jan 20 Javascript
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
Vue-Router实现组件间跳转的三种方法
Nov 07 Javascript
微信小程序列表中item左滑删除功能
Nov 07 Javascript
JavaScript文档加载模式以及元素获取
Jul 28 Javascript
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
JavaScript前端面试组合函数
Jun 21 Javascript
二维码条形码生成的JavaScript脚本库
Jul 07 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php实现每日签到功能
2018/11/29 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
Python中endswith()函数的基本使用
2015/04/07 Python
python开发之文件操作用法实例
2015/11/13 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
详解Python中for循环是如何工作的
2017/06/30 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
Python 文件数据读写的具体实现
2020/01/24 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
某科技软件测试面试题
2013/05/19 面试题
党支部公开承诺书
2014/03/28 职场文书
领导干部作风建设总结
2014/10/23 职场文书
北京导游词
2015/02/12 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL