javaScript之数组中reduce的详细介绍及使用

news2024/12/24 8:27:51

一、reduce功能接受及定义(自我理解)

  1. reduce方法为数组中的一个高阶函数,接受两个参数,第一个参数为回调函数,第二个为初始值。如果不给入初始值则会以数组第一项为初始值!
  2. reduce会循环数组每一项,并且会保留上一次循环的结果供下一次循环使用,最终结果为数组循环完毕后的最终返回(return)的值。
  3. 那这样咱们就可以这么理解了,给入一个初始值,后续操作都在给这个初始值做修饰!比如说给入对象最终返回对象、给入数组最终返回数组、给入字符串最终返回字符串、给入Boolean值最终返回Boolean值(true | false)…
  4. 再然后我们捋捋装饰器模式:允许向现有的对象添加功能,且不能影响它的构成(比如说一个人,你可以给他添加英语能力、可以给他添加法语能力,但是你不能让这个人的手没了),这么一看reduce不就是非常适合循环给对象添加功能吗?这不就是满足了装饰器模式了嘛。

二、各种使用方式

  1. 全网都有的最简单例子:累加递增
const arr = [1, 2, 3, 4, 5, 99]
arr.reduce((pre, next) => pre + next) // 114
  1. 【模仿数组includes】简单的includes功能模仿实现(返回某值是否在数组中出现过)
        const fn = () => { console.log(11) }
        const obj = {}
        const arr = [2, '2', fn, obj]
        const selfIncludes = (arr, value) => {
            // 使用try catche的原因是快速跳出循环。
            try {
                return arr.reduce((pre, next) => {
                    if (next === value) throw true
                    return false
                }, false)
            } catch (end) {
                if (typeof end === 'boolean') return true;
            }
        }
  1. 【模仿数组indexOf】简单的indexOf功能模仿实现(返回最先找到值的索引,没找到则返回-1)
        const fn = () => { console.log(11) }
        const obj = {}
        const arr = [2, '2', fn, obj]
        const selfIndexOf = (arr, value) => {
            // 使用try catche的原因是快速跳出循环。
            try {
                return arr.reduce((pre, next) => {
                    if (next === value) throw pre
                    return ++pre
                }, 0) && -1
            } catch (end) {
                if (typeof end === 'number') return end;
            }
        }
        console.log(selfIndexOf(arr, fn))
  1. 【模仿数组map】简单的map功能模仿实现(循环遍历数组最终返回处理后的值)
        const fn = () => { console.log(11) }
        const obj = {}
        const arr = [2, '2', fn, obj]
        const selfMap = (arr, fn) => {
            return arr.reduce((pre, next) => {
                // map方法并没有这一步
                // pre.push(fn?.(next, pre.length) || next)
                pre.push(fn(next, pre.length))
                return pre 
            }, [])
        }
        console.log(selfMap(arr, (item, i) => {
            return {
                name: item,
                index: i
            }
        }))
        console.log(selfMap(arr, () => {}))
        console.log(arr.map(() => {}))

在这里插入图片描述

  1. 过滤掉对象中为undefined、null、空字符串、NaN的key与值
    const filterParam = (obj) => Object.entries(obj).reduce((pre, [key, value]) => {
      // 这里添加你需要做的判断依据
      if (value || value === 0) pre[key] = value
      return pre
    }, {});
    console.log(filterParam({name: undefined, age: 0, class: 'ant-design', test: NaN}))
    // {age: 0, class: 'ant-design'}
  1. lodash 中 keyBy 功能简单实现(具体细节不考虑)
	const arr =  [
		{
			name: '张三',
			age: 16
		},
		{
			name: '李四',
			age: 17
		},
		{
			name: '王五',
			age: 18
		},
	]
	const keyBy = (array, key) => {
		return array.reduce((pre, next) => {
			pre[next[key]] = next;
			return pre;
		}, {})
	}
	console.log(
		keyBy(arr, 'name')
	)
  1. 装饰器模式演示(创建Person这个类,添加一个zs的Person,把skillArr中的技能教给zs,最后让zs使用学习到的技能)
        class Person {
            // 技能对象
            skill = {
                中文: (string) => {
                    // ..... 此处经过一系列的翻译(比如说调用百度的翻译)
                    return string;
                }
            }
            constructor(params) {
                // 初始化信息
                this.info = params;
            }
            // 学习技能的功能函数
            studySkill(skillName, skillFn) {
                if (this.skill[skillName]) return '这个技能我会!';
                this.skill[skillName] = skillFn;
                return `${skillName}学习完成`;
            }
            // 说话的功能函数
            say(string, way) {
                if (!this.info.isLanguage?.includes(way)) return '你确定这是一门语言吗?';
                if (!this.skill[way]) return '我不会这个语言!';
                return this.skill[way](string);
            }
        };
        const zs = new Person({
            name: 'zs',
            age: 18,
            isLanguage: ['中文', '英语', '法语', '俄语']
        });
        // 可学习的语言技能数组
        const skillArr = {
            英语: (string) => {
                // ..... 此处经过一系列的翻译(比如说调用百度的翻译)
                const end = 'Hello world';
                return end;
            },
            法语: (string) => {
                // ..... 此处经过一系列的翻译(比如说调用百度的翻译)
                const end = 'Bonjour, le monde.';
                return end;
            },
            中文: (string) => {
                // ..... 此处经过一系列的翻译(比如说调用百度的翻译)
                const end = '你好,世界。';
                return end;
            }
        }
        // reduce 主题
        Object.entries(skillArr).reduce((pre, next) => {
            const [skillName, skillFn] = next;
            const sayMessage = pre.studySkill(skillName, skillFn);
            console.log(sayMessage);
            return pre;
        }, zs);
        // --------------
        console.log(zs);
        console.log(zs.say('你好', '英语')) // Hello world
        console.log(zs.say('你好', '法语')) // Bonjour, le monde.
        console.log(zs.say('你好', '中文')) // 你好
        console.log(zs.say('你好', '俄语')) // 我不会这个语言!
        console.log(zs.say('你好', '鸟语')) // 你确定这是一门语言吗?

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库-深度剖析mysql索引原理(上)(三)

目录 一、什么是索引 二、索引由来 三、索引本质 四、索引数据结构 1、hsah 2、Btree 五、myISAM 和Innodb这两个数据库的索引是如何实现的呢? 1、首先看 MYSAM 1、以主键Id字段建立索引 2、以name字段来建立索引 2、在看Innodb数据库引擎的数据库 1、以…

Linux安装Jenkins详细步骤

安装jdk yum安装不需要配置环境变量 安装maven 下载maven 压缩包上传至服务器 解压缩 修改maven配置文件镜像地址 配置环境变量 安装Git 安装Jenkins war包下载 安装运行Jenkins 安装jdk 【Linux】Linux8 安装 JDK(适用于各个版本)_写bug的程…

JavaScript 数值 Number

目录1 数值 number1.1 数值储存1.2 数值表示1.2.1 数值分隔符1.3 特殊数值1.3.1 正零和负零1.3.2 NaN1.3.3 Infinity1.4 数值相关的全局方法1.5 Number 对象1.5.1 Number()1.5.2 Number 静态属性1.5.3 Number 静态方法1.5.4 Number 实例方法1.5.5 自定义方法1.6 Math 对象1.6.1…

ev-MOGA多目标进化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

如何在 Windows 10 中安装 Azure Data Studio 1.39.1

安装 Azure Data Studio 1.39.1 官网下载 Azure Data Studio 1.39.1安装 Azure Data Studio 1.39.1Azure Data Studio 是一个跨平台数据库工具,适用于在 Windows、macOS 和 Linux 上使用本地和云数据平台的数据专业人员。 Azure Data Studio 提供了 IntelliSense、代码片段、源…

Java实现基于RSA的数字签名

加密与数字签名的区别 1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 数字签名的应用 问题:在比特币中,怎么证明这个交易是你发布的? 这是就需要用到数字…

客户关系应该如何管理?

网络经过十多年的产业发展,中国的网络用户已经超过了8亿,网络也渐渐改变了盲目的商业价值追求,趋于稳定理性,已经开始向着多个路径全面性产业发展。网络上出现了各式各样的网络营销方式,如邮件网络营销、广告行业、浏览…

【python实战】朋友因股票亏了,很惨常愤恨不平,当天我就分析出原因:怎么做到的?(听说关注我的人会暴富)

导语 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 对于大部分股票投资者来说,一年能拿住翻倍的股票就实属不易。一年10倍,甚至…

生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN

编号: 162943中文名称: 生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN英文名: Biotin-εAhx-Gly-Leu-Lys-Leu-Arg-Phe-Glu-Phe-Ser-Ly英文同义词: Biotinyl-LC-hCAP-18 (134-170) (Scrambled), Biotinyl-LC-Cationic Antimicrobial Protein 18 (134-170) (human) …

hi mate, lets recall the bloody “JOIN“

补补数据库基础 上图中,表A的记录是123,表B的记录是ABC,颜色表示匹配关系。返回结果中,如果另一张表没有匹配的记录,则用null填充。 注意:多表连接查询会比直接使用自带的API查询表中的一个属性&#xff0…

基于STM32单片机的智能窗帘系统

本设计是基于STM32单片机的智能窗帘系统,主要实现以下功能: 1、 定时模式:早上(7:00)自动打开窗帘,晚上(19:00)自动关闭窗帘。 2、 手动模式:通过按键实现对…

处理 S4过账时的错误:“更正统一日记账分类账的定制设置”

目录 一、问题起因 二、问题分析​​​​​​​ 三、解决方法: 一、问题起因 在一个新配置的S4系统做FI凭证出现了如下报错: 点开后,报错显示如下: 更正统一日记账分类账的定制设置 消息号 FINS_ACDOC_CUST201 诊断 通用日记账的分类账…

SCADA系统在石油炼制行业的应用:如何实现石油炼制过程实时数据采集与监控?

一、应用背景 随着经济的逐步发展,企业开始关注基础技术和生产质量的提升。其中,作为基础工业项目的石油炼制企业需要对整体技术进行集中的整合,强化基础动态生产调度以及系统化的电子商务结构,才能提升整个行业的市场竞争力。 …

抢跑“补盲”风口,纯固态激光雷达上车面临哪些挑战?

未来两年,激光雷达市场高速发展的同时,来自市场的需求也逐渐清晰化。 高工智能汽车研究院预测数据显示,预计2025年前装标配激光雷达交付将有望达到200万颗/年的规模。其中,面向私人消费市场的车型,将主要以1颗前向、2…

“如何实现高效的应用交付”鲁班会开发者训练营厦门站进行时

摘要:2022年11月18日,来自厦门创新中心的40余位开发者,齐聚华为云鲁班会开发者训练营厦门站,与华为云技术大咖共同探讨技术未来,落地应用交付。为了抓住新时代IT技术脉搏,一同探讨企业数字化转型中面临的种…

Qt富文本处理

一、富文本文档结构 文本文档由 QTextDocument 类表示,该类包含有关文档内部表示、结构的信息,并跟踪修改以提供撤消/回撤功能。 1.1、基本结构 每个文档始终包含一个根框架,并且始终包含至少一个文本块。 框架/表格总是由文档中的文本块…

16.PyQt5中的事件系统之事件(QEvent)的传递(分发)和处理

PyQt5中的事件系统之事件(QEvent)的传递(分发)和处理 使用Qt编程,几乎不用考虑事件,因为当产生某种事件时,Qt窗口部件都会发射一个相应的信号(即Qt会把事件转换为一个对应的信号),比如按钮被按下时&#x…

Servlet是什么?怎么使用?

前言: 服务器里面资源分为动态资源和静态资源 动态资源:Servlet、Jsp 静态资源:HTML、CSS、JS 一、概念 1.什么是servlet? 本质上是一个接口,提供了规范。是java提供的一门动态的web资源开发技术。 2.servlet体…

【C++】string类超详细解析

参考文献:C标准库官网 前言:在C/C的学习过程当中一定一定要多刷题,牛客网作为国内内容超级丰富的IT题库,尤其是它的C、C,有从入门到大厂真题,而且大部分的考试题目也是从中抽取,还有很多面经&am…

智慧职教解决方案-最新全套文件

智慧职教解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧职教全套最新解决方案合集一、建设背景 职业教育目前存在的问题: 发展理念相对落后国际化程度不高基本制度不健全层次结构不合理基础能力相对薄弱社会吸引力不强行业企业参与不…