JavaScript合并动态键对象数组 仅对键名含_abs的字段值求和
需求说明
现有如下结构的对象数组:
[ {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2, ...}, {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2, ...}, {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2, ...}, {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2, ...} ]
处理规则:
- 每个对象可包含任意n组键值对,每类指标都对应带
_perc和_abs后缀的两个字段 - 数组归约为单个对象:所有键名带
_abs后缀的字段值累加求和,所有_perc后缀字段统一赋值为"-"
预期输出格式:
{"A_abs": 16, "A_perc": "-", "B_abs": 16, "B_perc": "-", "C_abs": x, "C_perc": "-", ...}
原有参考的通用reduce求和逻辑会对所有字段无差别累加,无法区分_abs和_perc字段,不符合需求,原代码如下:
var data = [{"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2},{"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2},{"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2},{"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2}], result = data.reduce((r, o) => (Object.entries(o).forEach(([k, v]) => r[k] = (r[k] || 0) + v), r), {}); console.log(result);
实现代码
只需要在遍历键值对时增加后缀判断逻辑即可,无需提前预知字段数量、字段前缀,自动适配所有符合后缀规则的字段:
const data = [ {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2}, {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2}, {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2}, {"A_abs":4,"A_perc":2, "B_abs":4,"B_perc":2} ]; const result = data.reduce((acc, cur) => { Object.entries(cur).forEach(([key, val]) => { if (key.endsWith('_abs')) { // 仅_abs后缀字段执行累加 acc[key] = (acc[key] || 0) + val; } else if (key.endsWith('_perc')) { // _perc字段固定赋值为"-" acc[key] = "-"; } }); return acc; }, {}); console.log(result); // 运行输出:{A_abs: 16, A_perc: "-", B_abs: 16, B_perc: "-"}
该逻辑兼容性强,后续新增任意指标(比如C、D、E类的_abs/_perc字段)都不需要修改代码,会自动完成累加和赋值。
内容的提问来源于stack exchange,提问作者toffler
相关产品推荐
相关产品推荐

