如何将Mongo聚合输出的嵌套对象数组转为堆叠柱状图所需格式
解决Mongo聚合结果转堆叠柱状图数据格式的方案
需求说明
给定Mongo聚合输出的文档状态追踪数组,需将其转换为堆叠柱状图所需格式,要求data数组严格遵循["legal", "operations", "accounting"]的部门顺序,同时将无k字段的条目合并到空状态""中。
输入数据
const input = [ { "legal": [ { "k": "", "v": 6 }, { "v": 3}, { "k": "To be uploaded", "v": 5 }, { "k": "To be reviewed", "v": 96 } ], "operations": [ { "v": 1 }, { "k": "To be uploaded", "v": 3 }, { "k": "To be reviewed", "v": 24 } ], "accounting": [ { "k": "To be reviewed", "v": 137 }, { "k": "", "v": 3 }, { "v": 2 }, { "k": "To be uploaded", "v": 24 }, { "k": "Not Required", "v": 1 } ] } ];
转换代码(JavaScript)
// 指定固定部门顺序 const deptOrder = ["legal", "operations", "accounting"]; const statusMap = {}; // 遍历每个部门的状态数据 deptOrder.forEach(dept => { input[0][dept].forEach(item => { // 无k字段的条目归为空状态 const status = item.k ?? ""; const value = item.v; // 初始化状态对应的data数组,默认填充0 if (!statusMap[status]) { statusMap[status] = { name: status, data: new Array(deptOrder.length).fill(0) }; } // 累加对应部门的数值 const deptIndex = deptOrder.indexOf(dept); statusMap[status].data[deptIndex] += value; }); }); // 按需求的状态顺序整理结果 const result = [ statusMap[""], statusMap["To be uploaded"], statusMap["To be reviewed"], statusMap["Not Required"] ]; console.log(JSON.stringify(result, null, 2));
输出结果
[ { "name": "", "data": [9, 1, 5] }, { "name": "To be uploaded", "data": [5, 3, 24] }, { "name": "To be reviewed", "data": [96, 24, 137] }, { "name": "Not Required", "data": [0, 0, 1] } ]
代码关键点
- 使用
item.k ?? ""统一处理无k字段的条目,归为空状态 - 初始化每个状态的
data数组时填充0,确保缺失部门的数值为0 - 严格按照指定部门顺序累加数值,保证
data数组顺序符合要求
内容的提问来源于stack exchange,提问作者papawheelie
相关产品推荐
相关产品推荐

