新闻中心

J*aScript/ReactJS中实现数组对象分组求和的SQL式聚合操作

2025-10-10
浏览次数:
返回列表

JavaScript/ReactJS中实现数组对象分组求和的SQL式聚合操作

本文详细介绍了如何在J*aScript和ReactJS环境中,对数组对象进行类似SQL SUM和GROUP BY的聚合操作。通过迭代和中间对象存储的方式,演示了如何高效地根据指定属性(如ProjectType)对数组中的数值属性(如Amount和Hours)进行分组求和,最终生成结构化的聚合结果,避免了重复过滤和求和的繁琐步骤。

在现代前端应用开发中,尤其是在reactjs等框架中处理数据时,我们经常会遇到需要对数组中的对象进行分组和聚合计算的需求。这类似于关系型数据库中sql的sum和group by操作,即根据一个或多个键对数据进行分组,然后对每个组内的特定数值字段进行求和。

考虑以下一个包含项目信息的数组:

const frames = [
  {
    ProjectName: "Blue",
    EmployeeGroup: false,
    Amount: 50,
    Hours: 15,
    ProjectType: "Romeo",
  },
  {
    ProjectName: "Red",
    EmployeeGroup: false,
    Amount: 20,
    Hours: 5,
    ProjectType: "Lima",
  },
  {
    ProjectName: "Green",
    EmployeeGroup: true,
    Amount: 40,
    Hours: 10,
    ProjectType: "Lima",
  }
];

我们的目标是根据ProjectType对Amount和Hours进行求和,最终得到如下结构的数据:

[
  {
    ProjectType: "Lima",
    TotalAmount: 60,
    TotalHours: 15,
  },
  {
    ProjectType: "Romeo",
    TotalAmount: 50,
    TotalHours: 15,
  }
]

直接使用array.filter和array.reduce组合虽然可以实现对单一ProjectType的求和,但如果需要对所有ProjectType进行聚合,这种方法会导致多次遍历和重复逻辑,效率较低且代码冗余。

实现分组求和的策略

为了高效地实现类似SQL GROUP BY和SUM的功能,我们可以采用一种常见的J*aScript模式:利用一个中间对象作为累加器,在一次遍历中完成分组和求和。

迷你天猫商城 迷你天猫商城

迷你天猫商城是一个基于Spring Boot的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为迷你天猫商城的核心组成部分之一,天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。所有页面均兼容IE10及以上现代浏览器。部署方式1、项目

迷你天猫商城 0 查看详情 迷你天猫商城

核心实现步骤

  1. 初始化一个空对象作为累加器:这个对象将用于存储按ProjectType分组后的聚合数据。ProjectType将作为这个对象的键。
  2. 遍历原始数组:对frames数组中的每个元素进行迭代。
  3. 检查并初始化分组项:在每次迭代中,检查当前元素的ProjectType是否已作为键存在于累加器对象中。
    • 如果不存在,则为该ProjectType创建一个新的聚合对象,并初始化TotalAmount和TotalHours为0。
    • 如果已存在,则直接使用现有聚合对象。
  4. 累加数值:将当前元素的Amount和Hours累加到对应ProjectType的聚合对象中的TotalAmount和TotalHours。
  5. 提取最终结果:遍历完成后,累加器对象包含了所有分组的聚合数据。使用Object.values()方法将这个对象的值(即每个ProjectType的聚合结果)转换为一个数组,从而得到最终的期望输出。

示例代码

const frames = [
  { ProjectName: "Blue", EmployeeGroup: false, Amount: 50, Hours: 15, ProjectType: "Romeo" },
  { ProjectName: "Red", EmployeeGroup: false, Amount: 20, Hours: 5, ProjectType: "Lima" },
  { ProjectName: "Green", EmployeeGroup: true, Amount: 40, Hours: 10, ProjectType: "Lima" }
];

const items = {}; // 初始化一个空对象作为中间累加器

// 使用 forEach 遍历原始数组
frames.forEach( ({ ProjectType, Amount, Hours }) => {
  // 检查当前 ProjectType 是否已存在于累加器中
  if (!items[ProjectType]) {
    // 如果不存在,则为该 ProjectType 初始化一个新的聚合对象
    items[ProjectType] = { ProjectType, TotalAmount: 0, TotalHours: 0 };
  }
  // 累加 Amount 和 Hours
  items[ProjectType].TotalAmount += Amount;
  items[ProjectType].TotalHours += Hours;
});

// 使用 Object.values() 将累加器对象转换为最终的数组结果
const output = Object.values(items);

console.log(output);
/*
输出结果:
[
  { ProjectType: 'Lima', TotalAmount: 60, TotalHours: 15 },
  { ProjectType: 'Romeo', TotalAmount: 50, TotalHours: 15 }
]
*/

代码解析

  • const items = {};: items是一个普通J*aScript对象,它将以ProjectType的值作为键,存储每个项目类型的聚合数据。
  • frames.forEach( ({ ProjectType, Amount, Hours }) => { ... });: 我们使用forEach方法遍历frames数组。这里使用了ES6的对象解构,直接从当前frame对象中提取了ProjectType、Amount和Hours这三个属性,使代码更简洁易读。
  • if (!items[ProjectType]) { ... }: 这是分组逻辑的关键。它检查items对象中是否已经存在以当前ProjectType为键的属性。如果不存在(即这是我们第一次遇到这个ProjectType),就创建一个新的对象,并将其ProjectType、TotalAmount和TotalHours初始化。
  • items[ProjectType].TotalAmount += Amount;items[ProjectType].TotalHours += Hours;: 无论ProjectType是首次出现还是已经存在,我们都将当前Amount和Hours累加到对应ProjectType的TotalAmount和TotalHours上。
  • const output = Object.values(items);: forEach循环结束后,items对象看起来会是这样:
    {
      "Lima": { ProjectType: "Lima", TotalAmount: 60, TotalHours: 15 },
      "Romeo": { ProjectType: "Romeo", TotalAmount: 50, TotalHours: 15 }
    }

    Object.values()方法用于返回一个给定对象自身的所有可枚举属性值的数组,顺序与for...in循环给出的顺序一致。这样,我们就得到了期望的数组格式结果。

注意事项与总结

  • 效率:这种方法只需要对原始数组进行一次遍历(单趟操作),相比于多次filter和reduce的组合,在处理大型数据集时效率更高。
  • 可读性:代码逻辑清晰,易于理解,符合J*aScript开发者常用的模式。
  • 灵活性:如果需要聚合更多字段,只需在初始化时添加相应字段,并在累加步骤中增加对应的求和操作即可。
  • ReactJS环境:在React组件中,你可以在useEffect钩子中执行此类数据处理,或者在组件状态更新时调用此函数,以确保数据始终是最新的。

通过这种迭代加中间对象的策略,我们可以有效地在J*aScript中模拟SQL的GROUP BY和SUM操作,实现复杂的数据聚合需求,为前端应用的数据展示和分析提供强大的支持。

以上就是J*aScript/ReactJS中实现数组对象分组求和的SQL式聚合操作的详细内容,更多请关注其它相关文章!


# 这是  # 国外网站建设价格  # 服装租赁营销推广  # 嘉兴科技网站优化  # 提供seo优化报价  # 西丽服务型网站建设  # 营销号音乐推广号怎么弄  # 品牌seo快排网站  # 福田儿童网站优化怎么做  # 许昌企业网站建设推广  # 容城网站推广哪家好  # 我们可以  # 组中  # 只需  # 迭代  # react  # 是一个  # 象中  # 不存在  # 遍历  # 累加器  # red  # javascript开发  # 前端应用  # 应用开发  # 前端  # js  # java  # es6  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  深入理解J*a编译器的兼容性选项:从-source到--release  QQ官网正版登录链接 QQ在线登录入口最新  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  自定义Bag-of-Words实现:处理带负号的词汇权重  AO3最新镜像入口 Archive of Our Own官方平台访问  网站内容防复制粘贴的实现策略与局限性  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  mysql如何设置表访问权限_mysql表访问权限配置  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  深入理解J*a合成构造器:何时以及为何阻止其生成  J*a实现学校排课程序_面向对象结构化项目示例  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  从J*aScript对象中精确提取指定属性的教程  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  《主播少女的秘密账号迷宫》首支宣传片  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  Lar*el Form Request中唯一性验证在更新操作中的正确实现  AI泡沫首次被“刺破”:GPU十年都无法存活!  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  在Go Martini框架中高效服务动态生成图像的实践指南  ArrayList与LinkedList核心操作的Big-O复杂度分析  在命令行怎么运行html项目_命令行运行html项目方法【教程】  Typer应用中灵活处理命令行参数的令牌化与解析  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  J*aScript教程:根据元素文本内容动态设置背景色  163邮箱注册官网 免费申请163个人邮箱  服务端验证_j*ascript输入检查  12306选座如何查看座位示意图_12306座位示意图解读与使用  最新韩小圈网页版登录入口_官网在线观看官方链接 

搜索