JS中reduce的用法
JS中reduce的用法
- 前言
- 语法
- 举例
- reduce的应用
- 总结
前言
reduce() 方法对数组中的每个元素执行一个由您提供的reduce函数(升序执行),将其结果汇总为单个返回值。reduce方法可做的事情特别多,就是循环遍历能做的,reduce都可以做,比如数组求和、数组求积、数组中元素出现的次数、数组去重等等。
语法
arr.reduce(function(prev,cur,index,arr){...
}, init);
参数:
- prev 必需。累计器累计回调的返回值; 表示上一次调用回调时的返回值,或者初始值 init;
- cur 必需。表示当前正在处理的数组元素;
- index 可选。表示当前正在处理的数组元素的索引,若提供 init 值,则起始索引为- 0,否则起始索引为1;
- arr 可选。表示原数组;
- init 可选。表示初始值。
举例
- 没有设置函数的初始迭代值
const arr = [1,2,3,4,5];
const sum = arr.reduce(function(prev,cur,index,arr){console.log(prev,cur,index);return prev + cur;
});
console.log('arr:',arr,'sum:',sum);
运行结果:
分析:在这里reduce的作用就是对这个数组进行求和,迭代了4次,函数迭代的初始值是1,也就是默认值(数组的第一项),prev的值是每次计算后的值。
- 设置函数的初始迭代值
const arr = [1,2,3,4,5];
const sum = arr.reduce((prev,cur,index,arr) => {console.log(prev,cur,index);return prev + cur;
},5);
console.log('arr:',arr,'sum:',sum);
运行结果:
分析:这里我们添加了一个初始的迭代值,也就是让prev从5开始计算(以5为初始值求和),可以看到,这里迭代了5次,结果也加上了初始值。同时,这里使用箭头函数来代替完整的函数。 运行结果相同。
reduce的应用
- 数组求和
let arr = [1,2,3,4,5]
console.log(arr.reduce((a,b) => a + b)) // - 15
console.log(arr.reduce((a,b) => a * b)) // - 120
- 计算数组中每个元素出现的次数
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice', 'Bob', 'Bob'];
var countedNames = names.reduce(function (allNames, name) {console.log(allNames,name);if (name in allNames) {allNames[name]++;}else {allNames[name] = 1;}return allNames;
}, {});
console.log(countedNames);
运行结果:分析:
- 由于设置了迭代初始值,allNames的第一个值是一个空对象,此时name为Alice,然后进行判断,发现在allNames中没有Alice属性,所以就将Alice对应的属性值赋为1
- 后面没有重复的是一样的道理,如果碰到重复值,就会将该属性值加1,这样就能计算元素重复的次数了。
- 去除数组中重复的元素
let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd'];
let myOrderedArray = myArray.reduce(function (accumulator, currentValue) {if (accumulator.indexOf(currentValue) === -1) {accumulator.push(currentValue)}return accumulator;
}, []);
console.log(myOrderedArray); // - ['a','b','c','d']
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
let result = arr.sort().reduce((init, current) => {if(init.length === 0 || init[init.length-1] !== current) {init.push(current);}return init;
}, []);
console.log(result); // - [1,2,3,4,5]
分析:这里主要是借助迭代功能实现数组的扩展,判断当前元素是否已经添加到数组中,如果不存在就从尾部添加,这两个方法在去重方法中应该算比较简单高效的。
- 按属性对Object分类
var person = [{name: 'xiaoming',age: 18},{name: 'xiaohong',age: 17},{name: 'xiaogang',age: 17}
];
function groupBy(objectArray, property) {return objectArray.reduce(function (acc, obj) {var key = obj[property];if (!acc[key]) {acc[key] = [];}acc[key].push(obj);return acc;}, {});
}
var groupedPerson = groupBy(person, 'age');
console.log(groupedPerson);
运行结果:
- 对对象的属性求和
let people = [{ name: 'Alice', age: 21 },{ name: 'Max', age: 20 },{ name: 'Jane', age: 20 }
];
let result = people.reduce((a,b) =>{a = a + b.age;return a;
},0)console.log(result) // - 结果:61
分析:
这里主要就是利用reduce第一个参数是迭代,可以通过初始化这个参数的数据类型,达到想实现的效果。
总结
reduce() 是数组的归并方法,与 forEach()、map()、filter()等迭代方法一样都会对数组每一项进行遍历,但是reduce() 可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这一点是其他迭代方法无法企及的。
欢迎大家关注简书(雨过天晴nan)同文:https://www.jianshu.com/p/2ed489d8f1cc
喜欢的朋友欢迎点赞评论支持一下!谢谢!
JS中reduce的用法相关推荐
- JS中typeof的用法
转载自 JS中typeof的用法 js是一门弱语言,它在声明变量时无需确定变量的类型,js在运行时会自动判断.那么如何判断一个变量的类型呢,js提供了typeof运算符,用来检测一个变量的类型. 1 ...
- php function函数用法,js的function函数是什么?js中function的用法
本篇文章给大家带来的内容是关于js的function函数是什么?js中function的用法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Function与函数 Function是 ...
- append和appendTo的区别以及js中的appendChild用法
append和appendTo的区别以及js中的appendChild用法 很多像我一样接触JS没多久的小白对append和appendTo的区别以及js中的appendChild用法都会有所模糊,下 ...
- js中indexOf的用法详解
js中indexOf的用法详解 String.IndexOf 方法 (Char, [startIndex], [count]) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检 ...
- js控制页面滚动到指定位置,js中scrollIntoView()的用法
js中scrillIntoView()的用法--页面滚动到指定位置 最近遇到一个问题,在一个页面上,点击某个按钮时,滚动到页面的某一位置. 如图: 如果是我写的话,我可能会先获取滚动到的元素,然后获取 ...
- js中return的用法
js中return的用法 今天看到一篇文章,介绍的是js中return的用法,感触很深.(类似于JAVA return) 在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默 ...
- innerHTML连接指定HTML文件,js中innerhtml的用法
js中innerHTML与innerText的用法与区别 js中innerHTML的用法: innerHTML可获取或设置指定元素标签内的 html内容,从该元素标签的起始位置到终止位置的全部内容(包 ...
- es6中reduce的用法_es6中reduce的基本使用方法
前言 为啥要把es6 中 reduce 单独拿出来说呢,因为这个功能实在太骚,值得如此. reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值.reduc ...
- es6中reduce的用法_25个你不得不知道的数组reduce高级用法
背景 距离上一篇技术文章<1.5万字概括ES6全部特性>发布到现在,已经有整整4个月没有输出过一篇技术文章了.哈哈,不是不想写,而是实在太忙,这段时间每天不是上班就是加班,完全没有自己的时 ...
最新文章
- 生物信息培训之WGCNA-权重基因共表达网络分析
- Codejock的使用--皮肤
- MySQL 笔记8 -- 存储过程和索引
- 在东岸听刘元演奏萨克斯
- 转载:35岁前成功的12条黄金法则
- 查询url包含的字符串参数(js高程笔记)
- 当集合a为空集时a的取值范围_1.2 集合间的基本关系20202021学年高一数学新教材配套学案(人教A版必修第一册)...
- [Swift]LeetCode113. 路径总和 II | Path Sum II
- MatConvnet工具箱文档翻译理解三
- 视频不显示的分析方法
- 百度网盘搜索功能伪增强
- oracle varchar2 转换成date,将Oracle VARCHAR2转换为DATE并排除无效数据
- L. Collecting Diamonds
- Excel 2010 VBA 入门 109 获取某列最后非空单元格行号
- npm 全局安装 yarn、tsc、rimraf 不是内部或外部命令
- 产品经理如何做好需求调研
- 关于卫星伪距残差的理解
- 通过数据分析改进并达成SEO优化目标
- 可控制导航下拉方向的jQuery下拉菜单代码
- 从小市值因子策略入手,带你入门量化投资 (附年化收益率77.83%策略)
热门文章
- html5脸型捕捉,八种脸型所暗藏的运势
- 小武机器人怎么连不上网_小叮当智能机器人无法联网的解决办法
- RobotFramework:发现一个大坑,当post接口入参为json时,千万不能用sojson转化后的json串(ride解析会有异常,非sojson工具问题),直接用浏览器粘过来的就行...
- 机器人静力学与雅可比矩阵
- 20210101 4个月减脂心得总结
- Qlik Sense Desktop 初步体验
- 【Python 实战基础】Pandas如何计算一列数字的中位数
- [CF677E] Vanya and Balloons
- vaadin css,CSS标签样式Vaadin
- Linux笔记——运行模式之调度系统-作业管理-用户命令