三级嵌套数组各层级独立求和实现方案咨询
三级嵌套数组各层级独立求和实现方案咨询
嘿,我最近在处理一个三层嵌套数组的求和需求,卡壳在第二层和第三层的计算上,想请大家支支招!
我手头的数组是**市场(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); }
现在我需要的是:
- 针对单个行业,计算其下所有品类的指定字段总和(比如AGRICOLA行业下所有rubro的
v48总和) - 针对单个市场,计算其下所有行业的指定字段总和(比如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
相关产品推荐
相关产品推荐

