当前位置: 首页 > article >正文

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.kler.cn/news/365772.html

相关文章:

  • Kotlin-协程基础
  • 【电子元件】光通量和色温 (欧司朗LED灯珠 KW3 CGLNM1.TG命名规则)
  • 基于NVIDIA NIM平台—生成属于自己的DIY食谱
  • 如何使用 NumPy 和 Matplotlib 进行数据可视化
  • 计算机毕业设计PySpark+大模型高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设
  • UE5之5.4 第一人称示例代码阅读2 子弹发射逻辑
  • 【Android】Kotlin教程(1)
  • C#从零开始学习(用户界面)(unity Lab4)
  • UE5 第一人称示例代码阅读0 UEnhancedInputComponent
  • python实现斗地主
  • qt项目使用其他项目的.ui之指针
  • RabbitMQ安装部署
  • Elliott Wave Prophet,艾略特波浪预测指标!预测未来走势!免费公式!(指标教程)
  • 考研篇——数据结构王道3.2.2_队列的顺序实现
  • 大一物联网要不要转专业,转不了该怎么办?
  • Scala的多态:定义,作用,实现手法
  • AUTOSAR从入门到精通-英飞凌GTM模块
  • Go语言生成UUID的利器:github.com/google/uuid
  • Node.js 路由
  • 文本预处理——构建词云
  • 【云效】阿里云云效:一站式DevOps平台介绍与使用教程(图文)附PPT
  • 2024 项目管理工具大变革:Jira 的替代者是谁?
  • 【数据分享】全国各省份农业-瓜果类面积(1993-2018年)
  • Python+Django+VUE 搭建深度学习训练界面 (持续ing)
  • CRLF、UTF-8这些编辑器右下角的选项的意思
  • STM32Lx GXHT3x SHT3x iic 驱动开发应用详解