介绍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}

参考

数组reduce方法的高级技巧

js中reduce用法详解的更多相关文章

  1. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  2. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  3. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  4. JS 中 this 关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/call方法来调 ...

  5. C++中const用法详解

    本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...

  6. js 闭包的用法详解

    一.闭包 实现可重用的局部变量,且保护其不受污染的机制. 外层函数包裹受保护的变量和内层函数. 内层函数专门负责操作外层函数的局部变量. 将内层函数返回到外层函数外部,反复调用. 二.作用域 子函数会 ...

  7. JS中navigator对象详解

    <code class="language-html"><!doctype html> <html> <head> <meta ...

  8. AngularJS中transclude用法详解

    这篇文章主要介绍了AngularJS中transclude用法,详细分析了transclude的具体功能.使用技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了AngularJS中transcl ...

  9. Bom和Dom编程以及js中prototype的详解

    一.Bom编程: 1.事件练习: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

随机推荐

  1. python3使用迭代生成器yield减少内存占用

    技术背景 在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中.其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会 ...

  2. 分解uber依赖注入库dig-使用篇

    golang的依赖注入库非常的少,好用的更是少之又少,比较好用的目前有两个 谷歌出的wire,这个是用抽象语法树在编译时实现的. uber出的dig,在运行时,用返射实现的,并基于dig库,写了一个依 ...

  3. SSDT表结构的深入学习

    SSDT表的知识目录: A.了解SSDT结构 B.由SSDT索引号获取当前函数地址        C.如何获取索引号 D.获取起源地址-判断SSDT是否被HOOK E.如何向内核地址写入自己代码 A. ...

  4. C++扫雷小游戏(基于CMD命令行)

    这个小游戏是笔者在大一C语言课程设计的时候写的,基于命令行,为了显得漂亮一些,特别加上了彩色特效~~~ 注意:Win10系统须将命令行调为旧版命令行,否则有可能会显示乱码! 代码示例: #includ ...

  5. Windows PE变形练手3-把通用模板机器码直接覆盖目标PE

    把通用模板机器码直覆盖目标PE 这个地方真是尝试了好久,遇到很多坑点,Win PE那本书上的东西有点不够,也就直接写书上的例子会发现很多地方不是说的那样,里面提供的信息太少了,就比如里面并没有提被注入 ...

  6. 关于终端设备的设备唯一性的那些事之IMEI(转)

    最近和别人聊起来数据上报,一起讨论到imei和MAC地址,然后发现一个问题:知道这两个东西都不唯一,但是不知道为什么---- 回来上各种小网站巴拉巴拉找了一下,终于大概了解了前世今生,这里简单汇总一下 ...

  7. Android adb不是内部或外部命令 问题解决

    就是没有配置环境变量, 这个只需要将android安装:例如C:\Program File\android-sdk-windows\tools加入到系统变量Path中,需要注意的是Path中会配置的有 ...

  8. 如何利用CRM系统打通营销全渠道?

    企业经常通过不同渠道组织各种形式的营销推广,可惜,这些营销推广的效果往往差强人意. 相关研究表明,很多营销推广不理想的主要原因是不同营销渠道之间没有打通数据,不清楚每个营销渠道或营销策划的投入产出.推 ...

  9. 如何安装多个jdk并方便切换系统jdk版本

    如何安装多个jdk并方便切换系统jdk版本 前言 在安装myeclipse时,压缩包中附带1.8.0的jdk,顺便安装并配置环境变量后发现系统默认的jdk变为了1.8.0.随后发现eclipse只支持 ...

  10. cent7 配 yum源

    今天笔记配置CentOS 7本地镜像为yum源,废话不多说,上去就是干! 1:挂镜像: ? 1 2 3 4 #创建目标挂载目录 mkdir /media/CentOS7 #将镜像挂载到目标目录 mou ...