JavaScript reduce 高级用法:多层级数据结构转换与汇总

JavaScript reduce 高级用法:多层级数据结构转换与汇总

本文详细阐述了如何运用 javascript 的 `reduce` 方法对复杂对象数组进行深度转换与聚合。教程通过一个具体示例,展示了如何逐层构建嵌套结构,并根据 `medico`、`rateio` 和 `convenio` 等键对数据进行分组及 `subtotal` 求和,以实现高效且结构化的数据重塑。

JavaScript reduce 方法基础

在深入探讨复杂数据转换之前,我们首先回顾一下 Array.prototype.reduce() 方法。reduce() 方法对数组中的每个元素执行一个由您提供的 reducer 函数,将其结果汇总为单个返回值。

reducer 函数接收四个参数:

accumulator (累加器):上一次调用 reducer 函数的返回值,或者是 initialValue。currentValue (当前值):数组中正在处理的当前元素。currentIndex (当前索引):数组中正在处理的当前元素的索引。array (源数组):调用 reduce() 的数组本身。

reduce() 方法通常用于将数组扁平化、计算总和、构建新对象等场景,其灵活性使其成为处理复杂数据转换的强大工具

复杂数据转换需求分析

假设我们有一个扁平化的对象数组,其中包含 medico(医生)、rateio(费率)、convenio(协议)和 subtotal(小计)等信息:

立即学习“Java免费学习笔记(深入)”;

const arr = [  { medico: "med1", rateio: "rat1", convenio: "conv1", subtotal: 10 },  { medico: "med2", rateio: "rat2", convenio: "conv2", subtotal: 10 },  { medico: "med2", rateio: "rat2", convenio: "conv2", subtotal: 20 },  { medico: "med1", rateio: "rat1", convenio: "conv3", subtotal: 20 },  { medico: "med1", rateio: "rat1", convenio: "conv3", subtotal: 25 },  { medico: "med2", rateio: "rat3", convenio: "conv4", subtotal: 15 },  { medico: 'med2', rateio: 'rat4', convenio: 'conv3', subtotal: 10 },];

我们的目标是将这个扁平数组转换为一个高度结构化的嵌套数组,具体要求如下:

按 medico 分组:最外层以 medico 为键进行分组。按 rateio 分组:在每个 medico 组下,进一步按 rateio 分组。按 convenio 分组并汇总 subtotal:在每个 rateio 组下,按 convenio 分组,并将其对应的 subtotal 值进行累加,形成 sum_subtotal。

期望的输出结构如下:

const result = [  {medico: "med1", grantotals:[    {      rateio: "rat1",      grandtotals: [        { convenio: "conv1", sum_subtotal: 10 },        { convenio: "conv3", sum_subtotal: 45 } // 20 + 25      ]    }  ]},  {medico: "med2", grantotals:[      {        rateio: "rat2",        grandtotals: [          { convenio: "conv2", sum_subtotal: 30 }, // 10 + 20        ]      },      {        rateio: "rat3",        grandtotals: [          { convenio: "conv4", sum_subtotal: 15 },        ]      },      {        rateio: "rat4",        grandtotals: [          { convenio: "conv3", sum_subtotal: 10 },        ]      }    ]}];

使用 reduce 实现层级聚合

为了实现上述复杂转换,我们将利用 reduce 方法的累加器来逐步构建目标结构。核心思路是:对于原始数组中的每一个元素,我们都尝试在累加器中查找其对应的 medico、rateio 和 convenio 层级。如果存在,则更新 subtotal;如果不存在,则创建新的层级对象并添加到相应的位置。

示例代码

const arr = [    { medico: "med1", rateio: "rat1", convenio: "conv1", subtotal: 10 },    { medico: "med2", rateio: "rat2", convenio: "conv2", subtotal: 10 },    { medico: "med2", rateio: "rat2", convenio: "conv2", subtotal: 20 },    { medico: "med1", rateio: "rat1", convenio: "conv3", subtotal: 20 },    { medico: "med1", rateio: "rat1", convenio: "conv3", subtotal: 25 },    { medico: "med2", rateio: "rat3", convenio: "conv4", subtotal: 15 },    { medico: "med2", rateio: "rat4", convenio: "conv3", subtotal: 10 },];const result = arr.reduce((acc, obj) => {    // 1. 查找或创建 medico 层级    let existingMedico = acc.find((item) => item.medico === obj.medico);    if (!existingMedico) {        existingMedico = {            medico: obj.medico,            grantotals: [],        };        acc.push(existingMedico);    }    // 2. 在 medico 层级下查找或创建 rateio 层级    let existingRateio = existingMedico.grantotals.find(        (item) => item.rateio === obj.rateio    );    if (!existingRateio) {        existingRateio = {            rateio: obj.rateio,            grandtotals: [],        };        existingMedico.grantotals.push(existingRateio);    }    // 3. 在 rateio 层级下查找或创建 convenio 层级并更新 subtotal    let existingConvenio = existingRateio.grandtotals.find(        (item) => item.convenio === obj.convenio    );    if (existingConvenio) {        existingConvenio.sum_subtotal += obj.subtotal;    } else {        existingRateio.grandtotals.push({            convenio: obj.convenio,            sum_subtotal: obj.subtotal,        });    }    return acc;}, []);console.log(JSON.stringify(result, null, 2));

代码逐行解析

arr.reduce((acc, obj) => { … }, []);

reduce 方法被调用在原始数组 arr 上。acc 是累加器,初始化为一个空数组 [],它将逐步构建成最终的目标结构。obj 是 arr 中当前正在处理的元素。

查找或创建 medico 层级

Visual Studio IntelliCode Visual Studio IntelliCode

微软VS平台的 AI 辅助开发工具

Visual Studio IntelliCode 46 查看详情 Visual Studio IntelliCode

let existingMedico = acc.find((item) => item.medico === obj.medico);if (!existingMedico) {    existingMedico = { medico: obj.medico, grantotals: [] };    acc.push(existingMedico);}

acc.find(…):尝试在累加器 acc(即已构建的 medico 列表)中查找当前 obj.medico 是否已存在。如果 existingMedico 为 null 或 undefined(表示未找到),则创建一个新的 medico 对象,并将其 grantotals 数组初始化为空,然后将此新对象推入 acc。无论找到还是创建,existingMedico 都会指向当前 medico 的对象引用,以便后续操作。

在 medico 层级下查找或创建 rateio 层级

let existingRateio = existingMedico.grantotals.find(    (item) => item.rateio === obj.rateio);if (!existingRateio) {    existingRateio = { rateio: obj.rateio, grandtotals: [] };    existingMedico.grantotals.push(existingRateio);}

逻辑与 medico 层级类似。在 existingMedico.grantotals 数组中查找 obj.rateio。如果未找到,则创建一个新的 rateio 对象,初始化其 grandtotals 数组,并推入 existingMedico.grantotals。

在 rateio 层级下查找或创建 convenio 层级并更新 subtotal

let existingConvenio = existingRateio.grandtotals.find(    (item) => item.convenio === obj.convenio);if (existingConvenio) {    existingConvenio.sum_subtotal += obj.subtotal;} else {    existingRateio.grandtotals.push({        convenio: obj.convenio,        sum_subtotal: obj.subtotal,    });}

在 existingRateio.grandtotals 数组中查找 obj.convenio。如果找到:说明该 convenio 已存在,直接将其 sum_subtotal 属性加上当前 obj.subtotal。如果未找到:创建一个新的 convenio 对象,设置其 convenio 和 sum_subtotal(初始值为 obj.subtotal),然后将其推入 existingRateio.grandtotals。

return acc;

在每次迭代结束时,返回更新后的累加器 acc,它将作为下一次迭代的 accumulator。

性能考量与优化方案

上述 reduce 实现虽然功能正确且易于理解,但在处理大型数据集时可能会遇到性能瓶颈。主要原因是使用了 Array.prototype.find() 方法进行层层查找。find() 方法的时间复杂度为 O(N),在最坏情况下,每次迭代都需要遍历数组。如果 medico、rateio、convenio 的种类繁多,整个转换过程的复杂度将显著增加。

为了优化性能,我们可以考虑使用 JavaScript 的 Map 对象作为中间缓存,将查找操作的时间复杂度从 O(N) 降低到 O(1)。

基于 Map 的优化思路:

主累加器仍是数组: 最终结果仍是一个数组。引入 Map 进行快速查找: 在 reduce 的累加器中,除了最终结果数组,还可以维护一个或多个 Map 对象,用于存储已处理的 medico、rateio、convenio 对象的引用,以其唯一标识符作为键。例如,可以有一个 medicoMap,键是 medico 名称,值是对应的 medico 对象。类似地,每个 medico 对象内部可以维护一个 rateioMap,每个 rateio 对象内部维护一个 convenioMap。查找逻辑: 每次处理 obj 时,首先通过 medicoMap.get(obj.medico) 快速查找。如果不存在,则创建新 medico 对象,添加到结果数组,并更新 medicoMap。嵌套查找: 对于 rateio 和 convenio,也采用相同的方式,利用它们各自的 Map 进行 O(1) 查找和更新。

这种 Map 优化的方法可以显著提升处理大量数据的效率,尤其是在唯一键值较多的情况下。

总结

Array.prototype.reduce() 是 JavaScript 中一个极其强大的数组方法,能够实现从简单的聚合到复杂的数据结构转换。通过本教程,我们学习了如何利用 reduce 方法,结合条件判断和层级查找,将一个扁平化的对象数组转换为多层级嵌套并带有聚合计算的复杂结构。

在实际应用中,理解 reduce 的工作原理及其在不同场景下的适用性至关重要。同时,对于大型数据集,我们也应关注性能问题,并考虑使用 Map 等数据结构进行优化,以确保代码的效率和可扩展性。掌握这些技巧,将使您在处理 JavaScript 数据转换任务时更加得心应手。

以上就是JavaScript reduce 高级用法:多层级数据结构转换与汇总的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/875781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 07:19:25
下一篇 2025年11月28日 07:20:01

相关推荐

  • AI概念加密货币有哪些

    人工智能与区块链融合催生新型数字资产,2025年AI板块崛起。1.Render Network (RNDR)通过整合全球GPU算力降低AI训练成本;2.Fetch.ai (FET)利用自主代理实现机器间经济协作;3.Bittensor (TAO)构建分布式机器学习网络打破AI垄断;4.Arkham …

    2025年12月8日
    000
  • 币安 vs 欧易:哪个更适合新手?注册、交易、提现全指南

    加密货币市场的快速发展吸引了无数新用户,其中选择一个合适的数字货币交易所是进入这个世界的第一步。币安(binance)和欧易(okx)作为全球领先的两大平台,各有特点,新手在选择时常感到困惑。本文将对这两个交易所进行介绍和对比,帮助新手理解它们的差异,并提供注册、交易、提现的指引。 币安 (Bina…

    2025年12月8日
    000
  • 火币htxAPP下载指南:安卓/iOS官方安装步骤

    htx,作为一家全球知名的数字资产交易平台,自成立以来,致力于为全球用户提供安全、稳定、便捷的加密货币交易服务。平台支持丰富的数字资产种类,涵盖现货交易、杠杆交易、合约交易以及各种创新金融产品。htx手机app是连接用户与平台核心功能的重要工具,它提供了实时市场数据、专业的k线图分析工具、高效的交易…

    2025年12月8日
    000
  • 除了炒币,比特币、以太坊、狗狗币还能怎么玩?(实用指南)

    比特币、以太坊和狗狗币是数字资产领域备受瞩目的代表。虽然许多人初识它们是基于市场价格的波动和交易活动,但这些创新的技术载体远不止于投机工具。它们的底层分布式账本技术开启了广阔的非交易实用场景和应用可能性,为全球用户和开发者提供了探索新价值的途径。理解这些数字资产的多元用途,有助于我们更全面地认识它们…

    2025年12月8日
    000
  • 小心!投资狗狗币/以太坊/比特币最容易踩的5个大坑!

    新手投资加密货币常见误区包括盲目追涨杀跌、忽视安全存储、缺乏基本研究、忽视交易成本和落入诈骗陷阱。针对这些问题,应制定投资计划、使用硬件钱苞、学习基础知识、选择低手续费平台并警惕高回报骗局。具体而言,1.避免情绪化交易,采用DCA策略;2.用冷钱苞存储并备份私钥;3.阅读白皮书并关注可靠信息源;4.…

    2025年12月8日
    000
  • 为什么说以太坊可能比比特币更值得长期持有?

    在数字资产领域,比特币长期以来被许多人视为价值储存的首选,常被比作“数字黄金”。然而,作为市值仅次于比特币的加密网络,以太坊展现出了截然不同的设计哲学和日益增长的实际效用。它不仅是一种加密货币,更是一个庞大且活跃的去中心化应用开发平台。正是基于其独特的技术架构、持续的创新以及广泛的应用场景,越来越多…

    2025年12月8日
    000
  • 什么是双顶和双底?双顶和双底形态实战中的交易策略指南

    目录 什么是双顶和双底?双顶形态解读双底形态解读这些形态在加密货币中为何重要?双顶和双底形态实战中的交易策略指南1. 识别趋势2. 发现形态3. 等待确认4. 设置入场点、止损和获利目标5. 检查成交量双顶和双底重要技巧和常见陷阱成功技巧需要避免的陷阱用真实图表练习如何开始练习:结论:形态识别就是力…

    2025年12月8日
    000
  • 火币htx交易所官网下载地址是什么

    火币htx是一家全球知名的数字资产交易平台,致力于为用户提供安全、专业、便捷的交易服务。它支持多种加密货币的现货交易、合约交易以及其他衍生品服务。 官方下载地址: 火币HTX交易所 1. 丰富的交易品种:HTX提供广泛的数字资产交易对,涵盖主流加密货币如比特币(BTC)、以太坊(ETH)以及众多新兴…

    2025年12月8日
    000
  • 币安 vs 欧易:哪个交易所的提现速度更快?

    加密货币交易所作为数字资产交易的核心场所,在用户进行资产买卖、存储及转移时扮演着至关重要的角色。全球范围内有众多交易所,它们在服务、产品、费用以及性能上存在差异。对用户而言,选择一个合适的平台需要考量多方面因素,包括平台的可靠性、易用性以及交易效率。本文旨在对两家知名的加密货币交易所——币安和欧易进…

    2025年12月8日
    000
  • 比特币之后,下一个暴富机会是狗狗币还是以太坊?

    比特币的崛起,无疑是数字资产领域近年来最引人瞩目的现象之一。它从一个鲜为人知的概念,跃升为全球关注的焦点,为早期参与者带来了巨大的回报。这波浪潮激发了无数人对“下一个比特币”的探寻热情,希望复制那种惊人的资产增值体验。在众多数字资产中,以太坊(ethereum)和狗狗币(dogecoin)常常被提及…

    2025年12月8日
    000
  • 2025国际稳定币交易所排行_全球稳定币流动性交易所TOP5

    一键直达|2025主流加密资产交易所平台 Binance币安 Huobi火币 欧易OKX 2025国际稳定币交易所排行_全球稳定币流动性交易所TOP5 在2025年的全球虚拟货币市场中,稳定币作为价值锚定工具和交易媒介,其重要性愈发凸显。对于国际交易者和机构而言,一个交易所的稳定币流动性是衡量其核心…

    2025年12月8日
    000
  • oe国际交易平台.官方网址.直接进 oe国际交易平台官方版最新地址

    欢迎来到oe国际交易平台,作为全球领先的数字资产服务提供商之一,我们致力于为用户提供安全、稳定、高效的交易环境。通过我们的官方网站直接进入,您可以即刻体验前沿的金融技术与丰富的交易品种。平台凭借多年的行业经验,构建了坚固的技术壁垒与完善的风控体系,确保用户的资产安全与交易顺畅。 我们覆盖了多种主流与…

    2025年12月8日
    000
  • 灰度数字大盘是什么意思

    灰度数字大盘是指灰度投资旗下数字资产信托基金的整体表现,其核心包含单一资产信托和复合型基金。1.“灰度”指Grayscale Investments,旗下有GBTC、ETHE等信托产品;2.“数字大盘”狭义指追踪主流加密资产的GDLC基金,广义则涵盖灰度所有信托产品整体表现。关注灰度数字大盘的原因包…

    2025年12月8日
    000
  • 币圈空头回补是什么意思?交易者又该如何应对?和多头回补有什么区别?

    币圈空头回补是什么意思?币友如何应对币圈空头回补呢? 空头回补是金融市场中的一个常见现象,反映了市场参与者的交易行为和情绪变化。它可能是市场趋势反转的信号之一,也可能只是一次短暂的情绪释放。作为交易者,深入理解空头回补的本质将有助于更好得把握市场机会和管理风险。 空头回补是金融市场中的一个重要概念,…

    2025年12月8日 好文分享
    000
  • 狗狗币交易平台官网入口 安全可靠的数字货币交易平台

    数字资产交易平台构成了加密货币生态系统的核心基础设施。 这些平台为用户提供了买卖各种加密货币的场所。 随着市场的演变,不同平台凭借各自的特点和服务吸引了全球用户。 用户在选择交易平台时,通常会考虑安全性、交易费用、支持的币种数量以及用户体验等因素。 下面是一些在当前市场中受到广泛关注的交易平台,它们…

    2025年12月8日 好文分享
    000
  • 2025稳定币最好的交易所推荐_全球十大稳定币交易平台权威评测

    一键直达|2025主流加密资产交易所平台 Binance币安 Huobi火币 欧易OKX 2025稳定币最好的交易所推荐_全球十大稳定币交易平台权威评测 在2025年的虚拟货币市场中,稳定币继续扮演着至关重要的角色。它们作为连接传统金融与数字资产世界的桥梁,为交易者提供了价值储存和风险对冲的有效工具…

    好文分享 2025年12月8日
    000
  • Bitwise向美国SEC提交修正后的狗狗币现货ETF申请文件通过有望?

    狗狗币(DOGE)正朝着跻身主流金融市场,再向前迈出关键一步。美国资产管理公司Bitwise昨(26)日向美国证管会(SEC)提交修正后的狗狗币现货ETF申请文件,据业界观察,这不仅象征SEC已展开实质审查,更可能意味着核准时程正加速逼近。 彭博资深ETF分析师Eric Balchunas表示,Bi…

    2025年12月8日
    000
  • 2025好用的稳定币交易所排行_新手友好型稳定币平台TOP10

    一键直达|2025主流加密资产交易所平台 Binance币安 Huobi火币 欧易OKX 2025稳定币最好的交易所推荐_全球十大稳定币交易平台权威评测 在2025年的虚拟货币市场中,稳定币继续扮演着至关重要的角色。它们作为连接传统金融与数字资产世界的桥梁,为交易者提供了价值储存和风险对冲的有效工具…

    好文分享 2025年12月8日
    000
  • 稳定币在那个交易所兑换快_稳定币变现交易所推荐

    一键直达|2025主流加密资产交易所平台 Binance币安 Huobi火币 欧易OKX 2025稳定币最好的交易所推荐_全球十大稳定币交易平台权威评测 在2025年的虚拟货币市场中,稳定币继续扮演着至关重要的角色。它们作为连接传统金融与数字资产世界的桥梁,为交易者提供了价值储存和风险对冲的有效工具…

    好文分享 2025年12月8日
    000
  • 2025年下半年山寨币会爆发吗

    2025年下半年山寨币有望爆发。1.历史周期显示比特币减半后约500天市场见顶,2025年9-10月恰逢此节点;2.比特币现货ETF日均引入5-6亿美元资金,为市场构建坚实支撑;3.当前比特币市占率升至66%,接近历史山寨季启动前的临界值,预示资金正从比特币向山寨币轮动。 2025年下半年山寨币会爆…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信