如何用接口与默认值实现缺失部门返回0值的平均百分比JSON
实现方案:为无数据部门返回mean=0的平均值计算逻辑
核心思路
先获取所有部门的完整列表,再将数据库查询得到的有数据部门的平均值结果与之匹配,未匹配到的部门直接赋值mean=0。结合你已创建的Topic接口和0值常量,可按以下步骤落地:
具体实现步骤
假设你的现有代码结构如下(基于你提到的接口与服务代码):
1. 确认已定义的接口和常量
// 已创建的Topic接口 interface Topic { sector_name: string; percent_value?: number; // 允许为空,适配无数据场景 } // 已创建的0值常量 const DEFAULT_MEAN = 0;
2. 调整服务层逻辑
步骤1:获取全量部门列表
从数据库查询所有存在的部门名称(无论是否有topic数据),示例SQL:
SELECT DISTINCT sector_name FROM sectors;
步骤2:计算有数据部门的平均值
从数据库拉取有效percent_value数据,按部门分组计算平均值,得到初始结果集:
// 拉取有效数据 const topicData = await db.query('SELECT sector_name, percent_value FROM topics WHERE percent_value IS NOT NULL'); // 用Map存储部门统计数据(总和、数量),提升匹配效率 const sectorStatsMap = new Map<string, { sum: number; count: number }>(); topicData.forEach(item => { if (!sectorStatsMap.has(item.sector_name)) { sectorStatsMap.set(item.sector_name, { sum: 0, count: 0 }); } const stats = sectorStatsMap.get(item.sector_name)!; stats.sum += item.percent_value; stats.count += 1; }); // 转换为平均值对象数组 const existingMeans = Array.from(sectorStatsMap.entries()).map(([sector, stats]) => ({ sector_name: sector, mean: stats.sum / stats.count }));
步骤3:合并全量部门与平均值结果
遍历全量部门列表,匹配已有平均值,无匹配则使用DEFAULT_MEAN常量:
// 假设已获取全量部门列表:allSectors = [{ sector_name: "部门A" }, { sector_name: "部门B" }, { sector_name: "部门C" }] const allSectors = await db.query('SELECT sector_name FROM sectors'); // 生成最终结果 const finalResult = allSectors.map(sector => { const matched = existingMeans.find(item => item.sector_name === sector.sector_name); return { sector_name: sector.sector_name, mean: matched ? matched.mean : DEFAULT_MEAN }; });
3. 返回JSON结果
直接将finalResult转为JSON返回,示例输出:
[ { "sector_name": "部门A", "mean": 75.5 }, { "sector_name": "部门B", "mean": 62.0 }, { "sector_name": "部门C", "mean": 0 } ]
关键注意事项
- 确保全量部门列表的准确性,否则会遗漏需返回
mean=0的部门; - 用
Map存储统计数据,比数组遍历匹配效率更高,数据量大时优势明显; - 复用已定义的
DEFAULT_MEAN常量,避免硬编码,方便后续统一修改。
内容的提问来源于stack exchange,提问作者Henrique Fernandez
相关产品推荐
相关产品推荐

