JavaScript中reduce()详解及使用方法

news/2025/1/24 7:21:23/文章来源:https://www.cnblogs.com/Ao-min/p/18509581
reduce()方法接收一个函数做为累加器,数组中的每一个值(从左到右)开始缩减,最终计算为一个值,下面这篇文章主要给大家介绍了关于JavaScript中reduce()详解及使用方法的相关资料,需要的朋友可以参考下

reduce():

reduce()方法为归并类方法,最常用的场景就是,计算数组中的每一项的总和。

reduce() 方法会遍历数组的每一项,他接收两个参数:

第一个参数:每次遍历都会调用的函数,而这个函数有接收四个参数,分别是:前一个值、当前项、项目的索引和数组对象,而这个函数的返回值,回传给下一次遍历时,执行的这个方法的第一个参数。

第二个参数:归并基础的初始值

我们看一下例子: reduce()怎么用?

1
2
3
4
let arr = [1,2,3,4,5]
arr.reduce((prev,cur)=>{
     return prev+cur
})

上面的这段代码,是用来计算数组总和的,reduce()方法中,只传了第一个参数,也就是只传了一个函数,但第二个参数、初始值没有传,当第二个值没有传的时候,第一次循环,prev的值,默认为数组的第一项,而cur的值为数组的第二项,也就是第一次循环,会return 1+2,这个时候,第一次循环返回的结果回传给下一次循环中方法的第一个参数,也就是说、第二次循环方法中prev的值,是第一次循环方法返回的结果

1
2
3
4
let arr = [1,2,3,4,5]
arr.reduce((prev,cur)=>{
    return prev+cur
},10)

我们传入一下第二个参数,第一个循环,prev的值为reduce的第二个参数,也就是"归并基础的初始值",而cur的值为数组的第一项,第一项循环会返回10+1

总结:

1.当reduce()方法的第二个值为空时,第一次循环方法中的第一个参数(prev)为数组的第一项值,第二个参数(cur)为数组的第二项值,反之,第一次循环方法中的第一个参数(prev)为reduce的第二个参数值,第二个参数(cur)为数值的第一项值。

2.reduce()方法的第一个参数,就是每次遍历都会执行的匿名函数,当前函数的返回值就会传给下一次执行函数的第一个值。也就是prev

reduce 应用场景:

1.数组里所有值的和

1
2
3
4
5
6
7
var arr = [0,1,2,3];
 
var value = arr.reduce((pre, cur) => {
  return pre + cur;
}, 0);
 
console.log(value);// 输出:6

2.累加数组中对象的值

1
2
3
4
5
6
7
var arr = [{ x: 1 }, { x: 2 }, { x: 3 }];
 
var value = arr.reduce((pre, cur) => {
  return pre + cur.x;
}, 0);
 
console.log(value);// 输出:6

3.将二维数组转为一维数组

1
2
3
4
5
6
7
8
9
10
11
var arr = [
  [0, 1],
  [2, 3],
  [4, 5],
];
 
var value = arr.reduce((pre, cur) => {
  return pre.concat(cur);
}, []);
 
console.log(value); // 输出:[0, 1, 2, 3, 4, 5]

4.计算数组中每个元素出现的次数

1
2
3
4
5
6
7
8
9
10
11
12
var arr = ["a", "b", "a", "c", "c", "c"];
 
var value = arr.reduce((pre, cur) => {
  if (cur in pre) {
    pre[cur]++;
  } else {
    pre[cur] = 1;
  }
  return pre;
}, {});
 
console.log(value); // 输出:{a: 2, b: 1, c: 3}

5.按属性对object分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var people = [
  { name: "tom", age: 17, birthYear: 2021 },
  { name: "tony", age: 21, birthYear: 2021 },
  { name: "bob", age: 18, birthYear: 2020 },
  { name: "bob", age: 18, birthYear: 2021 },
  { name: "bob", age: 18, birthYear: 2019 },
];
 
function groupBy(arr, property) {
  if (!Array.isArray(arr)) return [];
 
  return arr.reduce((pre, obj) => {
    var newObj = {
      [property]: obj[property],
      data: [obj],
    };
 
    if (!pre.length) {
      return [newObj];
    }
 
    for (let i = 0; i < pre.length; i++) {
      let item = pre[i];
      if (item[property] === obj[property]) {
        item.data = [...item.data, obj];
        return pre;
      }
    }
    return [...pre, newObj];
  }, []);
}
 
var value = groupBy(people, "birthYear");

返回值:

6.数组去重:

1
2
3
4
5
6
7
var arr = [1, 2, 3, 2, 2, 3, 5, null, null, 0, false, false, true];
 
var value = arr.reduce((pre, cur) => {
  return pre.includes(cur) ? pre : pre.concat(cur);
}, []);
 
console.log(value);//[1, 2, 3, 5, null, 0, false, true]

附:reduce的高级用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
(1)计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let nameNum = names.reduce((pre,cur)=>{
  if(cur in pre){
    pre[cur]++
  }else{
    pre[cur] = 1
  }
  return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
 
 
(2)数组去重
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
},[])
console.log(newArr);// [1, 2, 3, 4]
 
(3)将二维数组转化为一维
 
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
(3)将多维数组转化为一维
 
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]
 
(4)、对象里的属性求和
var result = [
    {
        subject: 'math',
        score: 10
    },
    {
        subject: 'chinese',
        score: 20
    },
    {
        subject: 'english',
        score: 30
    }
];
 
var sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
}, 0);
console.log(sum) //60

转自于:https://www.jb51.net/article/282648.htm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/823076.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04 LTS 在线/离线安装 Docker

Docker 安装方式 准备环境 root@ubuntu2204:~# hostnamectlStatic hostname: ubuntu2204Icon name: computer-vmChassis: vmMachine ID: 06204406df2343f89f6ba6550a356854Boot ID: 3142ea12a9e64adbab7b8939935e7698Virtualization: vmware Operating System: Ubuntu 22.04.5 …

实验4:抽象工厂模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解抽象工厂模式的动机,掌握该模式的结构; 2、能够利用抽象工厂模式解决实际问题。[实验任务一]:人与肤色 使用抽象工厂模式,完成下述产品等级结构: 实验要求: 1.画出对应的类图; 2.提交源代码; 3.注意…

PromptKD:视觉语言模型的无监督提示提取

PromptKD:视觉语言模型的无监督提示提取快速学习已成为增强视觉语言模型(VLM)的一种有价值的技术,例如用于特定领域下游任务的CLIP。现有的工作主要集中在设计各种学习形式的提示,忽视了提示作为从大型教师模型中学习的有效蒸馏器的潜力。介绍了一种无监督的领域提示蒸馏框…

el-image图片预览显示bug

原本代码 <el-table-column label="附件" width="120"><template #default="scope"><el-imagev-if="scope.row.attachmentUrl":src="scope.row.attachmentUrl":preview-src-list="[scope.row.attachmen…

《HelloGitHub》第 103 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣!简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。github.com/521xueweihan/HelloGitHub这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift...让你在短…

.NET使用Moq开源模拟库简化单元测试

前言 今天大姚给大家推荐一个.NET开源、流行、使用简单的.NET模拟库:Moq。 Moq类库介绍 Moq是一个.NET开源、流行、使用简单的 .NET 模拟库,充分利用了.NET 的 Linq 表达式树和 lambda 表达式。这使得 Moq 成为最具生产力、类型安全且支持重构的模拟库。它不仅支持模拟接口,…

Codeforces Global Round 27 div1+2 个人题解(A~E)

Codeforces Global Round 27 div1+2 个人题解(A~E) Dashboard - Codeforces Global Round 27 - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <algorithm> #include <array> #include <bitset> #include <cassert> #include <cmat…

2024.10.22(周二)

[实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。…

实验3 c语言函数应用编程

task1:1 #include<stdio.h>2 3 char score_to_grade(int score);4 5 int main() {6 int score;7 char grade;8 9 while (scanf_s("%d",&score) != EOF) { 10 grade = score_to_grade(score); 11 printf("分数:%d,等级:%c…

JMeter JMeter-pugin-rabbitMQ消息发布插件

开发环境 RabbitMQ 3.9.16 Erlang 23.3.4.11 Apache-jmeter-5.3 Apache Maven 3.5.4 JDK 1.8.0_121 插件下载地址 https://gitee.com/ishouke/jmeter-plugin-rabbitmq/tree/master 插件使用方法 插件配置 将插件及依赖类库目录下的所有.jar 文件放到 %JMETER_HOME\lib\ext目录…

读数据工程之道:设计和构建健壮的数据系统22获取阶段考虑因素

获取阶段考虑因素1. 有边界与无边界数据 1.1. 无边界数据是现实中存在的数据,是事件发生时的数据,要么是间断的,要么是连续的、持续的和流动的 1.2. 有边界数据是跨越某种边界(如时间)对数据进行归类的一种便捷方式1.2.1. 所有的数据在有边界之前都是无边界的1.3. 长期以来…