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 ...
随机推荐
- ASP封装DLL 直接上代码
ASP转DLL 基本引用类库 OLE Automation Com+ services Type Library Microsoft Active Server Pages Object Micros ...
- 3. Linux基本结构与终端打开方法,关闭方法。
Linux基本机构: 应用程序 标准库 Linux操作系统内核 硬件 (上层依赖于下层) 终端工具: 打开方法: 1.点击图标 2.搜索命令:终端 退出终端: 1.exit<回车> 2.C ...
- MYSQL中TIMESTAMP类型的默认值理解
MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样. 1.自动UPDATE 和INSERT 到当前的时间:表:----------- Table Create Table ...
- LA3415保守的老师
题意: 有n个学生,老师要带他们出去玩,但是老师比较保守,怕他们之间萌生爱意,所以带出去的所有同学必须至少满足四个条件中的一组,问最多能带多少人出去玩. 思路: 比较简单二分 ...
- (翻译)Attacking Interoperability(攻击互操作性)in Black Hat 2009 研究报告
前言 攻击互操作性(Attacking Interoperability)是 Mark & Ryan & David 发表于 2009 年的美国黑帽大会(Black Hat)上的一份研 ...
- [转帖]大家分析分析C++ X64X86通用驱动读写API源码教程
//#include <windows.h>//#include <algorithm> //#include <string.h>//#include < ...
- Portswigger web security academy:Insecure deserialization
Insecure deserialization [toc] Modifying serialized objects 题目描述 此lab使用了 基于序列化的session机制 可以借此进行权限提升 ...
- 基于RRCF(robust random cut forest)的时间序列异常检测流程
摘要:RRCF是亚马逊提出的一个流式异常检测算法,是对孤立森林的改进,可对时序或非时序数据进行异常检测.本文是我从事AIOps研发工作时所做的基于RRCF的时序异常检测方案. 1. 数据格式 ...
- 基于python对B站收藏夹按照视频发布时间进行排序
基于python对B站收藏夹按照视频发布时间进行排序 前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难, ...
- 一文带你详细介绍c++中的std::move函数
前言 在探讨c++11中的Move函数前,先介绍两个概念(左值和右值) 左值和右值 首先区分左值和右值 左值是表达式结束后依然存在的持久对象(代表一个在内存中占有确定位置的对象) 右值是表达式结束时不 ...