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);

运行结果:分析:

  1. 由于设置了迭代初始值,allNames的第一个值是一个空对象,此时name为Alice,然后进行判断,发现在allNames中没有Alice属性,所以就将Alice对应的属性值赋为1
  2. 后面没有重复的是一样的道理,如果碰到重复值,就会将该属性值加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的用法相关推荐

  1. JS中typeof的用法

    转载自  JS中typeof的用法 js是一门弱语言,它在声明变量时无需确定变量的类型,js在运行时会自动判断.那么如何判断一个变量的类型呢,js提供了typeof运算符,用来检测一个变量的类型. 1 ...

  2. php function函数用法,js的function函数是什么?js中function的用法

    本篇文章给大家带来的内容是关于js的function函数是什么?js中function的用法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Function与函数 Function是 ...

  3. append和appendTo的区别以及js中的appendChild用法

    append和appendTo的区别以及js中的appendChild用法 很多像我一样接触JS没多久的小白对append和appendTo的区别以及js中的appendChild用法都会有所模糊,下 ...

  4. js中indexOf的用法详解

    js中indexOf的用法详解 String.IndexOf 方法 (Char, [startIndex], [count]) 报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检 ...

  5. js控制页面滚动到指定位置,js中scrollIntoView()的用法

    js中scrillIntoView()的用法--页面滚动到指定位置 最近遇到一个问题,在一个页面上,点击某个按钮时,滚动到页面的某一位置. 如图: 如果是我写的话,我可能会先获取滚动到的元素,然后获取 ...

  6. js中return的用法

    js中return的用法 今天看到一篇文章,介绍的是js中return的用法,感触很深.(类似于JAVA return) 在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默 ...

  7. innerHTML连接指定HTML文件,js中innerhtml的用法

    js中innerHTML与innerText的用法与区别 js中innerHTML的用法: innerHTML可获取或设置指定元素标签内的 html内容,从该元素标签的起始位置到终止位置的全部内容(包 ...

  8. es6中reduce的用法_es6中reduce的基本使用方法

    前言 为啥要把es6 中 reduce 单独拿出来说呢,因为这个功能实在太骚,值得如此. reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值.reduc ...

  9. es6中reduce的用法_25个你不得不知道的数组reduce高级用法

    背景 距离上一篇技术文章<1.5万字概括ES6全部特性>发布到现在,已经有整整4个月没有输出过一篇技术文章了.哈哈,不是不想写,而是实在太忙,这段时间每天不是上班就是加班,完全没有自己的时 ...

最新文章

  1. 生物信息培训之WGCNA-权重基因共表达网络分析
  2. Codejock的使用--皮肤
  3. MySQL 笔记8 -- 存储过程和索引
  4. 在东岸听刘元演奏萨克斯
  5. 转载:35岁前成功的12条黄金法则
  6. 查询url包含的字符串参数(js高程笔记)
  7. 当集合a为空集时a的取值范围_1.2 集合间的基本关系20202021学年高一数学新教材配套学案(人教A版必修第一册)...
  8. [Swift]LeetCode113. 路径总和 II | Path Sum II
  9. MatConvnet工具箱文档翻译理解三
  10. 视频不显示的分析方法
  11. 百度网盘搜索功能伪增强
  12. oracle varchar2 转换成date,将Oracle VARCHAR2转换为DATE并排除无效数据
  13. L. Collecting Diamonds
  14. Excel 2010 VBA 入门 109 获取某列最后非空单元格行号
  15. npm 全局安装 yarn、tsc、rimraf 不是内部或外部命令
  16. 产品经理如何做好需求调研
  17. 关于卫星伪距残差的理解
  18. 通过数据分析改进并达成SEO优化目标
  19. 可控制导航下拉方向的jQuery下拉菜单代码
  20. 从小市值因子策略入手,带你入门量化投资 (附年化收益率77.83%策略)

热门文章

  1. html5脸型捕捉,八种脸型所暗藏的运势
  2. 小武机器人怎么连不上网_小叮当智能机器人无法联网的解决办法
  3. RobotFramework:发现一个大坑,当post接口入参为json时,千万不能用sojson转化后的json串(ride解析会有异常,非sojson工具问题),直接用浏览器粘过来的就行...
  4. 机器人静力学与雅可比矩阵
  5. 20210101 4个月减脂心得总结
  6. Qlik Sense Desktop 初步体验
  7. 【Python 实战基础】Pandas如何计算一列数字的中位数
  8. [CF677E] Vanya and Balloons
  9. vaadin css,CSS标签样式Vaadin
  10. Linux笔记——运行模式之调度系统-作业管理-用户命令