js中reduce用法详解
介绍reduce
reduce() 方法接收一个函数作为累加器
,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引,原数组
语法:arr.reduce(callback,[initialValue])
callback:函数中包含四个参数
- previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
- currentValue (数组中当前被处理的元素)
- index (当前元素在数组中的索引)
- array (调用的数组) initialValue (作为第一次调用 callback 的第一个参数。)
应用
const arr = [1, 2, 3, 4, 5]
const sum = arr.reduce((pre, item) => {
return pre + item
}, 0)
console.log(sum) // 15
以上回调被调用5次,每次的参数详见下表
callback | previousValue | currentValue | index | array | return value |
---|---|---|---|---|---|
第1次 | 0 | 1 | 0 | [1, 2, 3, 4, 5] | 1 |
第2次 | 1 | 2 | 1 | [1, 2, 3, 4, 5] | 3 |
第3次 | 3 | 3 | 2 | [1, 2, 3, 4, 5] | 6 |
第4次 | 6 | 4 | 3 | [1, 2, 3, 4, 5] | 10 |
第5次 | 10 | 5 | 4 | [1, 2, 3, 4, 5] | 15 |
使用reduce方法可以完成多维度的数据叠加。
例如:计算总成绩,且学科的占比不同
1 const scores = [
2 {
3 subject: 'math',
4 score: 88
5 },
6 {
7 subject: 'chinese',
8 score: 95
9 },
10 {
11 subject: 'english',
12 score: 80
13 }
14 ];
15 const dis = {
16 math: 0.5,
17 chinese: 0.3,
18 english: 0.2
19 }
20 const sum = scores.reduce((pre,item) => {
21 return pre + item.score * dis[item.subject]
22 },0)
23 console.log(sum) // 88.5
递归利用reduce处理tree树形
1 var data = [{
2 id: 1,
3 name: "办公管理",
4 pid: 0,
5 children: [{
6 id: 2,
7 name: "请假申请",
8 pid: 1,
9 children: [
10 { id: 4, name: "请假记录", pid: 2 },
11 ],
12 },
13 { id: 3, name: "出差申请", pid: 1 },
14 ]
15 },
16 {
17 id: 5,
18 name: "系统设置",
19 pid: 0,
20 children: [{
21 id: 6,
22 name: "权限管理",
23 pid: 5,
24 children: [
25 { id: 7, name: "用户角色", pid: 6 },
26 { id: 8, name: "菜单设置", pid: 6 },
27 ]
28 }, ]
29 },
30 ];
31 const arr = data.reduce(function(pre,item){
32 const callee = arguments.callee //将运行函数赋值给一个变量备用
33 pre.push(item)
34 if(item.children && item.children.length > 0) item.children.reduce(callee,pre); //判断当前参数中是否存在children,有则递归处理
35 return pre;
36 },[]).map((item) => {
37 item.children = []
38 return item
39 })
40 console.log(arr)
还可以利用reduce来计算一个字符串中每个字母出现次数
1 const str = 'jshdjsihh';
2 const obj = str.split('').reduce((pre,item) => {
3 pre[item] ? pre[item] ++ : pre[item] = 1
4 return pre
5 },{})
6 console.log(obj) // {j: 2, s: 2, h: 3, d: 1, i: 1}
参考
js中reduce用法详解的更多相关文章
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- JS中this关键字详解
本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...
- JS 中 this 关键字详解
本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/call方法来调 ...
- C++中const用法详解
本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...
- js 闭包的用法详解
一.闭包 实现可重用的局部变量,且保护其不受污染的机制. 外层函数包裹受保护的变量和内层函数. 内层函数专门负责操作外层函数的局部变量. 将内层函数返回到外层函数外部,反复调用. 二.作用域 子函数会 ...
- JS中navigator对象详解
<code class="language-html"><!doctype html> <html> <head> <meta ...
- AngularJS中transclude用法详解
这篇文章主要介绍了AngularJS中transclude用法,详细分析了transclude的具体功能.使用技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了AngularJS中transcl ...
- Bom和Dom编程以及js中prototype的详解
一.Bom编程: 1.事件练习: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
随机推荐
- PAT归纳总结——一些容易记混的概念
在刷题的过程中,有时候会遇到一些数据结构中的一些概念,如果对这些概念理解不清楚,甚至理解有误的话,就很可能把题目做错.所以,专门找出在刷题过程中出现的一些概念,以免考试的时候用到想不起来. 拓扑排序 ...
- 030- 控制语句if…else…
语法: 第一种结构: if(boolean表达式){ java语句; } 解释:如果if后面的boolean表达式是true就执行大括号里面的java语句 如果是false就不执行大括号中的java语 ...
- 【beego】beego的路由设置
beego 存在三种方式的路由:固定路由.正则路由.自动路由 基础路由 从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由,应用中的大多数路由都会定义在 routers/rout ...
- 缓冲区溢出分析第05课:编写通用的ShellCode
前言 我们这次的实验所要研究的是如何编写通用的ShellCode.可能大家会有疑惑,我们上次所编写的ShellCode已经能够很好地完成任务,哪里不通用了呢?其实这就是因为我们上次所编写的ShellC ...
- hdu2899 三分
题意: 给你个函数,F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x ,给你一个y,x的范围是0--100 问你最小的 F(x) 思路: 本人推数学公式啥 ...
- MySQL UDF提权执行系统命令
目录 UDF UDF提权步骤 UDF提权复现(php环境) UDF UDF (user defined function),即用户自定义函数.是通过添加新函数,对MySQL的功能进行扩充,其实就像使用 ...
- JavaScript 的入门学习案例,保证学会!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Win64 驱动内核编程-29.强制解锁文件
强制解锁文件 强制解锁因其他进程占用而无法删除的文件. 1.调用 ZwQuerySystemInformation 的 16 功能号来枚举系统里的句柄 2.打开拥有此句柄的进程并把此句柄复制到自己的进 ...
- thinkphp5.1 第三方类库引入
说明:在thinkPHP 5.1.X新版取消了Loader::import方法以及import和vendor助手函数(我的PHPExcel包在vendor文件夹中) 1.上图 2.控制器中:
- lower_bound和upper_bound的实现
int lowerBound(int* nums, int numsSize, int target) { //注意left和right的初始值必须是left = 0, right = numsSzi ...