You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三级嵌套数组各层级独立求和实现方案咨询

三级嵌套数组各层级独立求和实现方案咨询

嘿,我最近在处理一个三层嵌套数组的求和需求,卡壳在第二层和第三层的计算上,想请大家支支招!

我手头的数组是**市场(mercado)→行业(sector)→品类(rubro)**的三层结构,每个层级都有v48、a0、a1、a2、a3这些数值字段。目前我已经搞定了最顶层(市场层级)的字段求和,但行业和品类层级的累加一直没做对,而我需要每个层级的每个字段都能算出汇总值,用来展示在嵌套表格里。

先给大家看下我的示例数据:

DATA = [
  {
    "mercado": "AGROALIM",
    "sector": [
      {
        "sector": "AGRICOLA",
        "rubro": [
          {
            "rubro": "FORRAJE",
            "v48": 0.65046,
            "a0": 0.63372546,
            "a1": 0.65046,
            "a2": 0.65046,
            "a3": 0
          },
          {
            "rubro": "FRUTAS",
            "v48": 3.0869145,
            "a0": 0.34910247,
            "a1": 3.0869145,
            "a2": 3.0869145,
            "a3": 0.24792662
          },
          {
            "rubro": "UVAS",
            "v48": 2.3387132,
            "a0": 0,
            "a1": 2.3387132,
            "a2": 2.3387132,
            "a3": 0
          },
          {
            "rubro": "VEGETALES",
            "v48": 54.80923,
            "a0": 25.5776,
            "a1": 54.80923,
            "a2": 54.80923,
            "a3": 6.0376153
          }
        ],
        "v48": 60.88532,
        "a0": 26.560429,
        "a1": 60.88532,
        "a2": 60.88532,
        "a3": 6.2855415
      },
      {
        "sector": "ALIMENTOS",
        "rubro": [
          {
            "rubro": "BEBIDAS",
            "v48": 1.2313427,
            "a0": 0.16636576,
            "a1": 1.2313427,
            "a2": 1.2313427,
            "a3": 0.61833805
          },
          {
            "rubro": "CECINAS",
            "v48": 12.669079,
            "a0": 7.1717906,
            "a1": 12.669079,
            "a2": 12.669079,
            "a3": 2.115978
          },
          {
            "rubro": "CONSERVAS",
            "v48": 33.866325,
            "a0": 8.312485,
            "a1": 33.866325,
            "a2": 33.866325,
            "a3": 12.918893
          },
          {
            "rubro": "HARINA",
            "v48": 3.7472982,
            "a0": 0.011847539,
            "a1": 3.7472982,
            "a2": 3.7472982,
            "a3": 0
          },
          {
            "rubro": "LACTEOS",
            "v48": 5.181415,
            "a0": 0,
            "a1": 5.181415,
            "a2": 5.181415,
            "a3": 0
          },
          {
            "rubro": "VINO",
            "v48": 6.591118,
            "a0": 4.3435507,
            "a1": 6.591118,
            "a2": 6.591118,
            "a3": 0
          }
        ],
        "v48": 63.28658,
        "a0": 20.006039,
        "a1": 63.28658,
        "a2": 63.28658,
        "a3": 15.653209
      },
      {
        "sector": "ANIMALES",
        "rubro": [
          {
            "rubro": "ANIMALES",
            "v48": 0,
            "a0": 0,
            "a1": 0,
            "a2": 0,
            "a3": 0
          },
          {
            "rubro": "CRIANZA",
            "v48": 7.259204,
            "a0": 3.696346,
            "a1": 7.259204,
            "a2": 7.259204,
            "a3": 1.4296815
          }
        ],
        "v48": 7.259204,
        "a0": 3.696346,
        "a1": 7.259204,
        "a2": 7.259204,
        "a3": 1.4296815
      }
    ],
    "v48": 665.07355,
    "a0": 198.37775,
    "a1": 665.07355,
    "a2": 665.07355,
    "a3": 129.8242
  },
  {
    "mercado": "COMERCIO",
    "sector": [
      {
        "sector": "DST MATERIALES",
        "rubro": [
          {
            "rubro": "ACERO",
            "v48": 59.89149,
            "a0": 13.750453,
            "a1": 59.89149,
            "a2": 59.89149,
            "a3": 5.890896
          },
          {
            "rubro": "DST MATERIALES",
            "v48": 4.495523,
            "a0": 0,
            "a1": 4.495523,
            "a2": 4.495523,
            "a3": 4.104237
          },
          {
            "rubro": "M CONSTRUCCION",
            "v48": 4410.735,
            "a0": 1214.6946,
            "a1": 4410.735,
            "a2": 4410.735,
            "a3": 519.7534
          },
          {
            "rubro": "M ELECTRICO",
            "v48": 115.70385,
            "a0": 28.76517,
            "a1": 115.70385,
            "a2": 115.70385,
            "a3": 14.594371
          },
          {
            "rubro": "TORNILLOS",
            "v48": 16.949966,
            "a0": 13.514951,
            "a1": 16.949966,
            "a2": 16.949966,
            "a3": 0
          }
        ],
        "v48": 4607.7754,
        "a0": 1270.7251,
        "a1": 4607.7754,
        "a2": 4607.7754,
        "a3": 544.34296
      },
      {
        "sector": "DST UTILES",
        "rubro": [
          {
            "rubro": "U AUTOMOTRIZ",
            "v48": 553.1792,
            "a0": 114.20921,
            "a1": 553.1792,
            "a2": 553.1792,
            "a3": 143.01349
          },
          {
            "rubro": "U MINERIA",
            "v48": 159.25165,
            "a0": 52.779083,
            "a1": 159.25165,
            "a2": 159.25165,
            "a3": 15.5641575
          },
          {
            "rubro": "U OFICINA",
            "v48": 1.7601775,
            "a0": 0.33449724,
            "a1": 1.7601775,
            "a2": 1.7601775,
            "a3": 0.12675817
          },
          {
            "rubro": "U SALUD",
            "v48": 1.2493496,
            "a0": 1.2493496,
            "a1": 1.2493496,
            "a2": 1.2493496,
            "a3": 0
          },
          {
            "rubro": "U TALLER",
            "v48": 1033.7096,
            "a0": 202.98636,
            "a1": 1033.7096,
            "a2": 1033.7096,
            "a3": 251.42595
          },
          {
            "rubro": "U VESTIMENTA",
            "v48": 0.12437412,
            "a0": 0,
            "a1": 0.12437412,
            "a2": 0.12437412,
            "a3": 0
          }
        ],
        "v48": 1749.2743,
        "a0": 371.5585,
        "a1": 1749.2743,
        "a2": 1749.2743,
        "a3": 410.13034
      }
    ],
    "v48": 6357.05,
    "a0": 1642.2837,
    "a1": 6357.05,
    "a2": 6357.05,
    "a3": 954.47327
  }
]

目前我实现的顶层(市场层级)求和代码是这样的:

let this.mercadoData = DATA;

public calculateTotal(item: string) {
  return this.mercadoData.reduce((accum, curr) => accum + curr[`${item}`], 0);
}

现在我需要的是:

  1. 针对单个行业,计算其下所有品类的指定字段总和(比如AGRICOLA行业下所有rubro的v48总和)
  2. 针对单个市场,计算其下所有行业的指定字段总和(比如AGROALIM市场下所有sector的a0总和)

有没有大佬能帮我写出对应的求和方法呀?最好能和我现有的calculateTotal风格保持一致,方便在表格里调用~


适配需求的实现方案

其实针对这两个层级的求和,我们可以复用reduce方法,只是需要针对不同层级的数组来操作:

1. 品类(rubro)层级求和

这个方法接收一个行业对象和要计算的字段名,返回该行业下所有品类对应字段的总和:

public calculateRubroTotal(sector: any, item: string) {
  // 累加行业下所有rubro的指定字段
  return sector.rubro.reduce((accum: number, curr: any) => accum + curr[item], 0);
}

2. 行业(sector)层级求和

这个方法接收一个市场对象和要计算的字段名,返回该市场下所有行业对应字段的总和:

public calculateSectorTotal(mercado: any, item: string) {
  // 累加市场下所有sector的指定字段
  return mercado.sector.reduce((accum: number, curr: any) => accum + curr[item], 0);
}

使用示例

  • 计算AGROALIM市场下所有行业的v48总和:calculateSectorTotal(DATA[0], 'v48')
  • 计算AGRICOLA行业下所有品类的a0总和:calculateRubroTotal(DATA[0].sector[0], 'a0')

如果之后需要更灵活的层级求和,也可以写一个递归函数来适配任意嵌套深度,但针对当前的三层结构,上面的方法已经足够清晰易用啦~

备注:内容来源于stack exchange,提问作者screspo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:43:11