js 关于 reduce 的基本使用

news/2024/7/10 23:28:41 标签: es6
      array.reduce((prev, cur, index, arr)=>{

      },init)

       prev:表示上一次调用时的返回值;或者初始值init;

       cur:表示当前正在处理的数组元素

       index:表示正在处理的数组元素的索引,若提供init,则索引为0,否则索引为1

       arr: 表示将要操作的源数组

       init:表示初始值

       首先,要明确的是,prev表示的是上一次回调时的返回值,或者初始值init,
       在我们第一次调用的时候,
       
       案例1,没有设置init的值,在没有设置init值的情况下,index的索引值是从1开始(prev也可以认为是0),
       其实第一次的时候就隐式调用了prev + cur,你可以理解为是在背后做了pre:0 + cur:1,
       我们在控制台看到的就是整个计算过程,index是1 ~ 6。
       
       在第二个案例中,init设置的值是2,那么就代表prev的初始值是2,那么第一次的时候,index是从0开始的,
       第一次调用的返回结果就是`2 + arr[0]:1 = 3`,整个过程index是从0 ~ 6,共7次
       
	// 案例1
    const arr = [1, 2, 3, 4, 5, 6, 7]
    const sum = arr.reduce((prev, cur, index) => {
      console.log('prev - 上一次调用时的返回值=', prev)
      console.log('cur - 当前正在处理的数组元素=', cur)
      console.log('index - 当前正在处理的数组元素-索引=', index)
      console.log('========================================')
      return prev + cur
    })
    console.log('案例1的sum=', sum)



    // 案例2
    const arr1 = [1, 2, 3, 4, 5, 6, 7]
    const sum1 = arr1.reduce((pre, cur, index) => {
      console.log('案例2的cur=', cur)
      console.log('案例2的index=', index)
      return pre + cur`在这里插入代码片`
    }, 2)
    console.log('案例2的sum=', sum1)


	
	// 案例3
    let allList = [1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 7, 8]
    // acc:累加器(即当前的累积值),curr:当前正在处理的元素
    let myLlist = allList.reduce((acc, curr) => {
      const isDuplicate = acc.some(item => item === curr)

      if (!isDuplicate) {
        acc.push(curr)
      }

      return acc
    }, [])
    console.log('myList=', myLlist) // [1, 2, 3, 4, 5, 6, 7, 8]

数组扁平化
    let a = []
    let b = [4, 5, 6]
    console.log('a.concat(b)=', a.concat(b)) // [4, 5, 6]


    const arr2 = [1, [2, [3, [4, 5]]], 6]

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

    console.log(newArr(arr2)) // [1, 2, 3, 4, 5, 6]

数组去重
    // 数组去重
    const arr3 = [1, 2, 3, 4, 5, 3, 2, 1, 6, 4, 7, 8]

    // 方法1
    const resultArr = arr3.reduce((pre, cur) => {
      if (!pre.includes(cur)) {
        return pre.concat(cur)
      }
      else {
        return pre
      }
    }, [])
    console.log(resultArr) // [1, 2, 3, 4, 5, 6, 7, 8]

    // 方法2
    const resArr = arr3.reduce((prev, cur) => {
      if (prev.indexOf(cur) === -1) {
        prev.push(cur)
      }
      return prev
    }, [])
    console.log(resArr) // [1, 2, 3, 4, 5, 6, 7, 8]


    // 方法3
    let arr = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4]
    let result = arr.sort().reduce((init, current) => {
      if (init.length === 0 || init[init.length - 1] !== current) {
        init.push(current)
      }
      return init
    }, [])
    console.log(result) // [1,2,3,4,5]

计算数组中每个元素出现的次数
    let person = ['李白', '雅典娜', '安琪拉', '李白', '诸葛亮', '安琪拉']
    let nameObj = person.reduce((pre, cur) => {
      if (cur in pre) { // 因为设置了初始值init,所有第一次的pre等于init的值,即:{}
        pre[cur]++
      }
      else {
        pre[cur] = 1
      }
      console.log('pre=', pre)
      return pre
    }, {})
    console.log(nameObj) // {李白: 2, 雅典娜: 1, 安琪拉: 2, 诸葛亮: 1}
    /*
      pre= {李白: 1}
      pre= {李白: 1, 雅典娜: 1}
      pre= {李白: 1, 雅典娜: 1, 安琪拉: 1}
      pre= {李白: 2, 雅典娜: 1, 安琪拉: 1}
      pre= {李白: 2, 雅典娜: 1, 安琪拉: 1, 诸葛亮: 1}
      pre= {李白: 2, 雅典娜: 1, 安琪拉: 2, 诸葛亮: 1}
    */

http://www.niftyadmin.cn/n/5203434.html

相关文章

一般人用 Linux 算是找虐吗?

一般人用 Linux 算是找虐吗? 主要得看用什么Linux,毕竟Android也算是Linux,满大街一般人整天在用,也没什么人觉得自己在找虐。 最近很多小伙伴找我,说想要一些Linux的资料,然后我根据自己从业十年经验&…

AI辅助带货直播场景源码系统 附带网站的搭建教程

互联网技术的发展和普及,直播带货行业迅速崛起。然而,直播带货在带来商机的同时,也面临着诸多挑战。如直播内容缺乏新意、转化率低等问题。针对这些问题,AI辅助带货直播场景源码系统应运而生,旨在利用人工智能技术&…

如何用CHAT写励志文章?

问CHAT:写一篇以《过了60岁要积极面对身体疾病的坎儿》为题目,写一篇300字励志文章 CHAT回复: 标题:《过了60岁要积极面对身体疾病的坎儿》 人生,有时会像一趟不期而遇的旅程,各自带着乐观或悲观、阳光或…

算法通关村第一关挑战——帮鱼皮打印算法学员名单

package com.yugutou.charpter1_linklist.hk;/*** 第一关挑战*/ public class StudentLinkList {public static void main(String[] args) {Student head init();Student ccPython new Student("cc", "Python");add(head, ccPython);Student bcCPP new …

SQLServer 数字加千分位 用FORMAT函数强转不管多大位数

问题 CONVERT ( money, CONVERT ( money, CAST ( round( FTP_AMOUNT, 2 ) AS NUMERIC ( 20, 2 ) ) ) 1 ) AS FTP_AMOUNT用的money函数 结果空间不足,无法将 money 值转换为 varchar。 可以强转 select FORMAT(CAST ( round( ‘-8926143870680.62000000’, 2 ) AS N…

分布式锁防重复提交

参考博客 Aspect Component public class NotRepeatedSubmitAspect {private static final String LOCK_REPEATED_SUBMIT "lock_repeated_submit:";Autowiredprivate RedissonClient redissonClient;Around("annotation(notRepeatedSubmit)")public Obje…

win10 eclipse安装教程--

前言:安装eclipse之前必须安装JDK, 链接: 详细解读JDK与eclipse的安装,配置环境变量

【顺序表的应用-通讯录的实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、顺序表的应用 1. 基于动态顺序表实现通讯录 1、功能要求 2、代码实现 二、通讯录的代码实现 1.通讯录的底层结构(顺序表) (1)思路展示 (2)底层代码实现(顺序表…