JS 中 reduce()方法及使用

在这里插入图片描述
摘要:

开发中经常会遇到求合计的状况!比如和,积等!这次遇到的是求合计的和!

reduce()方法是JavaScript中Array对象的一种高阶函数,用于对数组中的每个元素执行一个由您提供的reducer函数(回调函数),将其结果汇总为单个返回值。以下是关于reduce()方法的详细解释:

arr.reduce(callback, initialValue)

callback: 必需。数组中的每个值(从左到右)都会执行该回调函数。

  • previousValue: 必需。上一次调用回调函数的结果,或者初始值(initialValue)。
  • currentValue: 必需。当前被处理的元素。
  • index(可选):当前元素的索引。
  • array(可选):调用reduce的数组。
  • initialValue(可选):传递给回调函数的初始值。如果没有提供初始值,reduce会从数组的第二个元素开始调用回调函数,跳过第一个元素。

工作原理

  • 如果提供了initialValue,则从数组的第一个元素开始,将initialValue作为第一次调用回调函数的第一个参数(previousValue),数组的第一个元素作为第二个参数(currentValue)。
  • 如果没有提供initialValue,则从数组的第二个元素开始,将数组的第一个元素作为第一次调用回调函数的第一个参数(previousValue),数组的第二个元素作为第二个参数(currentValue)。
  • 每次回调函数执行后,其返回值会作为下一次调用回调函数的第一个参数(previousValue)。
  • 最终,reduce方法返回最后一次调用回调函数的返回值,作为整个reduce操作的结果。

求和:

let arr = [1, 2, 3, 4];
let sum = arr.reduce((prev, cur) => prev + cur, 0); // 输出10
console.log(sum);

求乘积:

let arr = [1, 2, 3, 4];
let product = arr.reduce((prev, cur) => prev * cur, 1); // 输出24
console.log(product);

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

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 }

展平多维数组:

let twoDArr = [[0, 1], [2, 3], [4, [5, 6, 7]]];
let newArr = twoDArr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur), []);
console.log(newArr); // 输出[0, 1, 2, 3, 4, 5, 6, 7]

注意事项:

如果数组为空且没有提供initialValue,则会抛出TypeError。
reduce()对于空数组是不会执行回调函数的,除非提供了initialValue。

计算table中商品信息合计:

<el-table :data="productsList" border show-summary :summary-method="getSummaries"><el-table-column label="商品名称" prop="name" width="auto" align="center"/><el-table-column label="价格" prop="price" width="150" align="center"><template #default="{ row }">{{ row.price / 100 }}元</template></el-table-column><el-table-column label="下单数量" prop="count" width="100" align="center" /><el-table-column label="下单重量" prop="" width="100" align="center"><template #default="{ row }">{{ row.count * row.skus[0].sku}}</template></el-table-column><el-table-column label="下单金额" prop="payPrice" width="150" align="center"><template #default="{ row }">{{ row.payPrice / 100 }}元</template></el-table-column><el-table-column label="实发数量" prop="sendCount" width="100" align="center" /><el-table-column label="实发重量" prop="" width="100" align="center"><template #default="{ row }">{{ row.sendCount == unll ? row.sendWeight : row.sendCount * row.skus[0].unitNum }}             </template></el-table-column><el-table-column label="退补金额" prop="" width="150" align="center"><template #default="{ row }">{{ (row.makeUpMoney + row.quitUpMoney) / 100 }}元</template></el-table-column>
</el-table>
/** 合计 */
const getSummaries = (param) => {const { columns, data } = param;const sums = [];columns.forEach((column, index) => {if (index === 0) {sums[index] = '合计';return;}switch (column.label) {case '价格':sums[index] = `${data.reduce((total, row) => total + row.price, 0) / 100}元`;break;case '下单数量':sums[index] = data.reduce((total, row) => total + row.count, 0);break;case '下单重量':sums[index] = data.reduce((total, row) => total + (row.count * row.skus[0].skus), 0);break;case '下单金额':sums[index] = `${data.reduce((total, row) => total + row.payPrice, 0) / 100}元`;break;case '实发数量':sums[index] = data.reduce((total, row) => total + row.sendCount, 0);break;case '实发重量':sums[index] = data.reduce((total, row) => total + (row.sendCount == null ? row.sendWeight : row.sendCount * row.skus[0].sku), 0);break;case '退补金额':sums[index] = `${data.reduce((total, row) => total + ((row.makeUpMoney + row.quitUpMoney)), 0) / 100}元`;break;default:sums[index] = '';}});return sums;
}

方法二:

getSummaries(param) {const { columns, data } = param;const sums = [];columns.forEach((column, index) => {if (index === 0) {sums[index] = '合计';return;}const values = data.map(item => Number(item[column.property]));if (!values.every(value => isNaN(value))) {sums[index] = values.reduce((prev, curr) => {const value = Number(curr);if (!isNaN(value)) {return prev + value;} else {return prev;}}, 0);if (column.property === 'price' || column.property === 'payPrice' || column.property === 'makeUpMoney' || column.property === 'quitUpMoney') {sums[index] = `${sums[index] / 100}`;}} else {sums[index] = '';}});// 特殊处理下单重量和实发重量sums[3] = data.reduce((sum, item) => sum + (item.count * item.skus[0].sku), 0);sums[6] = data.reduce((sum, item) => sum + (item.sendCount !== null ? item.sendCount * item.skus[0].sku: item.sendWeight), 0);return sums;}

解释:
getSummaries 方法:

  • 接收 param 参数,包含当前表格的数据和列信息。
  • 遍历每一列,计算每列的合计值。
  • 对于 price、payPrice、makeUpMoney 和 quitUpMoney 列,将合计值转换为元。
  • 特殊处理 下单重量 和 实发重量 列,分别计算合计值。

合计行:

  • 第一列显示“合计”。
  • 其他列显示相应的合计值。
  • 这样,表格的合计行就会显示各列的合计值。

总结来说: reduce()方法是一种强大的数组处理方法,可以将数组中的元素归约为单个值,适用于各种复杂的数据处理场景。

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

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

相关文章

内置数据类型、变量名、字符串、数字及其运算、数字的处理、类型转换

内置数据类型 python中的内置数据类型包括&#xff1a;整数、浮点数、布尔类型&#xff08;以大写字母开头&#xff09;、字符串 变量名 命名变量要见名知意&#xff0c;确保变量名称具有描述性和意义&#xff0c;这样可以使得代码更容易维护&#xff0c;使用_可以使得变量名…

STM32-Modbus协议(一文通)

Modbus协议原理 RT-Thread官网开源modbus RT-Thread官方提供 FreeModbus开源。 野火有移植的例程。 QT经常用 libModbus库。 Modbus是什么&#xff1f; Modbus协议&#xff0c;从字面理解它包括Mod和Bus两部分&#xff0c;首先它是一种bus&#xff0c;即总线协议&#xff0c;和…

学习threejs,利用THREE.ExtrudeGeometry拉伸几何体实现svg的拉伸

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.ExtrudeGeometry拉伸…

通过ssh端口反向通道建立并实现linux系统的xrdp以及web访问

Content 1 问题描述2 原因分析3 解决办法3.1 安装x11以及gnome桌面环境查看是否安装x11否则使用下面指令安装x11组件查看是否安装gnome否则使用下面指令安装gnome桌面环境 3.2 安装xrdp使用下面指令安装xrdp&#xff08;如果安装了则跳过&#xff09;启动xrdp服务 3.3 远程服务…

C2W4.LAB.Word_Embedding.Part1

理论课&#xff1a;C2W4.Word Embeddings with Neural Networks 文章目录 Word Embeddings First Steps: Data PreparationCleaning and tokenizationSliding window of wordsTransforming words into vectors for the training setMapping words to indices and indices to w…

七,Linux基础环境搭建(CentOS7)- 安装Scala和Spark

Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Scala和Spark 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、Scala下载及安装 Scala是一门多范式的编程语言&#xff0c;一种类似java的编程语言&#xff0c;设计初衷是实现…

合并数组的两种常用方法比较

在 JavaScript 中&#xff0c;合并数组的两种常用方法是使用扩展运算符 (...) 和使用 push 方法。 使用扩展运算符 this.items [...this.items, ...data.items]; 优点&#xff1a; 易于理解&#xff1a;使用扩展运算符的语法非常直观&#xff0c;表达了“将两个数组合并成一个…

24.redis高性能

Redis的单线程和高性能 Redis是单线程吗&#xff1f; Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外 提供键值存储服务的主要流程。 Redis 的多线程部分&#xff0c;比如持久化、异步删除、集群数据同步等&#xff…

合合信息亮相PRCV大会,探讨生成式AI时代的内容安全与系统构建加速

一、前言 在人工智能技术的飞速发展下&#xff0c;生成式AI已经成为推动社会进步的重要力量。然而&#xff0c;随着技术的不断进步&#xff0c;内容安全问题也日益凸显。如何确保在享受AI带来的便利的同时&#xff0c;保障信息的真实性和安全性&#xff0c;已经成为整个行业待解…

C#/.NET/.NET Core全面的自学入门指南

自学入门建议 确认学习目标&#xff1a;自学C#/.NET首先你需要大概了解该门语言和框架的发展、前景和基本特点&#xff0c;从自身实际情况和方向出发确认学习的必要性。 制定学习计划&#xff1a;制定一个详细的学习计划&#xff08;比如每天学习一个C#/.NET知识点、小技能&am…

【web安全】缓慢的HTTP拒绝服务攻击详解

文章目录 前言一、攻击原理二、攻击类型三、攻击特点四、HTTP慢速攻击实战工具简介使用参数介绍五、修复建议前言 缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量http request攻击,直到服务器带宽被打满,造成…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关&#xff0c;包含对请求的路由和过滤两个主要功能。 1&#xff09;路由功能&#xff1a;负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础。 2&#xff09;过滤功能&#xff1a;负责对请求的过程…

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法

在当今科技日新月异的时代&#xff0c;行人入侵检测技术作为安全防护的重要组成部分&#xff0c;正经历着前所未有的发展。入侵检测算法平台部署LiteAIServer作为这一领域的佼佼者&#xff0c;凭借其卓越的技术实力与广泛的应用价值&#xff0c;正逐步成为守护公共安全的新利器…

R5:天气预测-探索式数据分析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 根据数据对 RainTomorrow 进行预测&#xff0c;熟悉探索式数据分析&#xff08;EDA&#xff09; 二、实验环境&#xff1a; 语言环境…

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式&#xff1a;在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…

LeetCode: 3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。   以下是棋盘的参考图。   如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。   坐标总是表示有效的棋盘方格。坐标的格式总是先…

【数据分享】全国各省份农业-瓜果类面积(1993-2018年)

数据介绍 一级标题指标名称指标全称单位指标解释农业瓜果类面积农业-瓜果类面积-瓜果类面积千公顷根据第三次全国农业普查结果&#xff0c;对2007年-2017年农业生产有关数据进行了修正。农业西瓜面积农业-瓜果类面积-西瓜面积千公顷根据第三次全国农业普查结果&#xff0c;对2…

守护头顶安全——AI高空抛物监测,让悲剧不再重演

在城市的喧嚣中&#xff0c;我们享受着高楼林立带来的便捷与繁华&#xff0c;却往往忽视了那些隐藏在高空中的危险。近日&#xff0c;震惊全国的高空抛物死刑案件被最高院核准并执行。案件中被告人多次高空抛物的举动&#xff0c;夺去了无辜者的生命&#xff0c;也让自己付出了…

django5入门【03】新建一个hello界面

文章目录 1、前提条件⭐2、操作步骤总结3、实际操作示例 1、前提条件⭐ 将上一节创建的 Django 项目导入到 PyCharm 中。 2、操作步骤总结 &#xff08;1&#xff09;在 HelloDjango/HelloDjango 目录下&#xff0c;新建一个 views.py 文件。 &#xff08;2&#xff09;在 H…

解决运行jar错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序

报错 众所周知jdk8以上都没有Javafx java -jar target/myyscan-1.0-SNAPSHOT.jar 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序解决 https://gluonhq.com/products/javafx/ 去下载/javafx/到本地&#xff0c;选择自己的型号 然后记得指定路径 java --m…