JS数组reduce()方法详解

2023-11-16

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce() 可以作为一个高阶函数,用于函数的 compose。

注意: reduce() 对于空数组是不会执行回调函数的。

 首先我们看一下参数initialValue:

// 当没有设置初始值
let arr = [1,3,4,6,7]
let sum = arr.reduce((total,current,index)=>{
   console.log(index, current, total);
   return total+current
})
console.log(sum, '求和')

 

 可以看出当没有设置initialValue的时候,可以看出total取值是arr[0](即数组下标为0的数值默认成initialValue)从数组的下标1开始遍历。

// 当有设置初始值
let arr2 = [1,3,4,6,7]
let sum2 = arr2.reduce((total,current,index)=>{
   console.log(index, current, total);
   return total+current
},10)
console.log(sum2, '求和')

 可以看出当设置initialValue的时候,从数组下标为0的开始遍历。

reduce()的简单用法:

1、reduce()最简单的用法就是累加和累乘

    // 累加和累乘
    let arr3 = [1,3,4,6,7];
    let sum3 = arr3.reduce((pre,cur)=> pre+cur)
    let multiply = arr3.reduce((pre,cur) => pre*cur)
    console.log(sum3) // 21
    console.log(multiply) // 504

reduce()的高级用法:

1、数组去重

    // 数组去重
    let arr4 = [1,3,2,5,3,1,2,7,8];
    let newArr = arr4.reduce((pre,cur)=>{
      if(!pre.includes(cur)){
        return pre.concat(cur)
      } else {
        return pre
      }
    },[]);
    console.log(newArr, '数组去重') // [1, 3, 2, 5, 7, 8] 

2、将二维数组转换成一维数组

    // 将二维数组转换成一维数组
    let arr5 = [[1,2],[3,4],[5,7]];
    let newArr2 = arr5.reduce((pre,cur)=>{
      return pre.concat(cur)
    },[]);
    console.log(newArr2, '二维转成一维') // [1, 2, 3, 4, 5, 7]

3、将多维数组转成一维数组

    // 将多维数组转换成一维数组
    let arr6 = [1,3,[4,5,6,[7,8,4]],[7,0,[2,4],9]];
    let newArr3 = this.flatArr(arr6);
    console.log(newArr3, '多维转一维') // [1, 3, 4, 5, 6, 7, 8, 4, 7, 0, 2, 4, 9]

  
   flatArr(arr){
      return arr.reduce((pre,cur)=>{
        return pre.concat(Array.isArray(cur)?this.flatArr(cur):cur)
      },[])
   }
  

4、操作对象数组中的对象属性

const data = [
      {
        id:1,
        name:'安徽'
      },
      {
        id:2,
        name:'南京'
      },
      {
        id:3,
        name:'上海'
      },
      {
        id:4,
        name:'杭州'
      },
      {
        id:5,
        name:'天津'
      },
      {
        id:6,
        name:'北京'
      },
      {
        id:7,
        name:'山东'
      },
      {
        id:8,
        name:'河南'
      },
      {
        id:9,
        name:'重庆'
      },
      {
        id:10,
        name:'成都'
      },
      {
        id:11,
        name:'合肥'
      },
    ]
    const city_list = data.reduce((prev, item, idx) => {
      let key =
      idx > 8
        ? `${idx + 1}00`
        : `0${idx + 1}00`;
      prev[key] = item.name;
      return prev;
    }, {});
    console.log(city_list, '转换后的城市列表')

    // 操作对象数组中的对象属性
    let person = [
      {
        name:'小红',
        age:16,
      },
      {
        name:'小黄',
        age:20,
      },
      {
        name:'小黑',
        age:21,
      },
    ]
    let sumAge = person.reduce((pre,cur)=>{
      return pre = pre+cur.age
    },0);
    console.log(sumAge) // 57

5、计算数组中每个元素出现的次数

    // 计算数组中每个元素出现的次数
    let arr7 =['红','黄','黑','黄','蓝','红']
    let num = arr7.reduce((pre,cur)=>{
      if(cur in pre){
        pre[cur]++
      }else {
        pre[cur] = 1
      }
      return pre
    },{})
    console.log(num,'num对象') //{红: 2, 黄: 2, 黑: 1, 蓝: 1} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS数组reduce()方法详解 的相关文章

随机推荐

  • Qt封装一个类管理moveToThread( )正确的开启多线程、安全的退出线程的实例

    看本篇的文章基础在于你已经懂得了简单的利用moveToThread的方法创建出一个线程 不会的话可以查看本篇博客 总结 QT 多线程 处理密集时的界面响应保持 运用 MultMoveToThread testObject new MultM
  • 记一次mysql进程无法启动的解决方案

    莫名其妙数据库崩了 试了很多方案启动不了 然后不经意看到 usr local mysql data目录下几个日志文件特别大 删除之后就能重启了 rw rw 1 mysql mysql 4497955 Mar 3 18 29 xxxx php
  • 【Unity Optimize】使用图集(Sprite Atlas)优化项目

    目录 1 图集 Sprite Atlas 介绍 2 创建与配置Sprite Atlas 2 1 创建Sprite Atlas 2 1 1 Unity2D项目 2 1 2 Unity3D项目 2 2 配置Sprite Atlas 2 3 注意
  • PLC接线详解

    PLC常见的输入设备有按钮 行程开关 接近开关 转换开关 拨码器 各种传感器等 输出设备有继电器 接触器 电磁阀等 想学好电气 必须先学会接线 如果线都接不好的话 设备出现问题时 依然是无从下手 正确地连接输入和输出线路 是保证PLC可靠工
  • 射频电路学习之LC振荡电路

    文章目录 前言 一 串联谐振电路 二 并联谐振电路 三 谐振电路的本质 总结 前言 谐振是指 当外力作用的频率与系统固有的振荡频率相同或非常接近时 振幅急剧增大的现象 其中产生谐振时的频率成为谐振频率 谐振是正弦电路中的一种特殊现象 回路也
  • IBM DISK queue_depth参数调整

    queue depth参数会影响disk i o性能 特别是在数据库等i o密集性应用中 适当调整设置此参数 会提高整体应用的性能 下面是在AIX 5 3 IBM ds4300上调整此参数的 步骤及注意事项 记录一下 下面物理磁盘hdisk
  • Windows 11 提升软件打开速度

    设置 gt 辅助功能 gt 视觉效果 gt 动画效果 关闭 设置 gt 辅助功能 gt 视觉效果 gt 透明效果 关闭 设置 gt 应用 gt 启动 都关闭
  • 08-wait 和 sleep 的区别

    1 源码 sleep public class Thread implements Runnable public static native void sleep long var0 throws InterruptedException
  • Qt实现图像自适应窗口大小之scaled()函数使用

    很多应用都需要显示图片 比如视频类应用 拍照类应用 但是在大数情况下用户都会改变窗口大小 以获得最佳效果 在Qt中如果只设置了显示图片而没有对自适应窗口做出设置 用户拖拽边框的时候 整个控件上就会出现大片空白部分 怎么解决这个问题呢 QIm
  • Python基础(四):Python函数和模块的讲解和应用

    一 前言 山东省小学已将Python内容纳入教材 江省已将信息技术教材VB编程语言替换为Python 计算机二级考试加入 Python语言程序设计 科目 越来越多的岗位也需要Python技能 Python连续4年成功登顶最流行的编程语言榜单
  • Git安装以及基本配置

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 提示 以下是本篇文章正文内容 下面案例可供参考 一 Git安装以及配置 git官网 https git scm com downloads 选择适合的版本进入下载 然后傻瓜式
  • 两个数组去重!

    var a1 1 2 3 4 5 var b1 1 2 var c1 a1 filter a gt return b1 some c gt c a 两个数组可快速对比去重
  • crontab日志包命令找不到和乱码问题

    crontab设置的定时任务 执行脚本报错命令找不到和乱码 使用crontab时的运行环境已经不是用户环境了 因此原本用户下的一些环境变量的设 置就失效了 因为我的命令path设置到了 etc profile里了 所以在crontab运行不
  • 【Flutter 1-8】Flutter教程Dart语言——控制语句

    控制语句 Dart语言的控制语句跟其他常见语言的控制语句是一样的 基本如下 if 和 else for 循环 while 和 do while 循环 break 和 continue switch 和 case assert If 和 El
  • centos 6.6 编译安装PHP7.0.5

    PHP7 0正式版也出来了 今天编译安装了一下 写下安装步骤 我是在centos6 6 环境中编译的 如下 下载地址http cn2 php net distributions php 7 0 5 tar gz 安装编译所需的包 如遇见部分
  • ListView 的position不正确的时如何处理

    当给ListView加了一个HeaderView后 代码如下 我们发现 onItemClick方法里的position参数的值不是我们所期望的 比如点击ListView的第一行 我们期望的position是0 可是实际上却是1 也就是说 它
  • OAuth2实现单点登录SSO完整教程,其实不难!

    点击上方 Java基基 选择 设为星标 做积极的人 而不是积极废人 源码精品专栏 原创 Java 2020 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 Rock
  • vovnet 测试

    vovnet39 1070 640 640 batch 1 15ms 自己改了参数 import time import torch import torch nn as nn import torch nn functional as F
  • Jvm实际运行情况-JVM(十七)

    上篇文章说jmap和jstat的命令 如何查看youngGc和FullGc耗时和次数 Jmap JVM 十六 Jvm实际运行情况 背景 机器配置 2核4G JVM内存大小 2G 系统运行天数 7天 期间发生FULL GC次数和耗时 500多
  • JS数组reduce()方法详解

    reduce 方法接收一个函数作为累加器 数组中的每个值 从左到右 开始缩减 最终计算为一个值 reduce 可以作为一个高阶函数 用于函数的 compose 注意 reduce 对于空数组是不会执行回调函数的 首先我们看一下参数initi