如何遍历对象数组并生成键值对形式的结果?
如何遍历对象数组并生成键值对形式的结果?
嘿,我完全get到你的需求了!你手里有一个包含不同部门的对象数组,每个部门的radars.all里可能包含p1、p2、p3plus(也就是你说的p3+)和total的统计值,要是某个属性缺失的话就默认count为0,最终要把这些数据整理成清晰的键值对形式对吧?我来给你一步步实现这个功能。
首先先把你提到的输入补全(根据你描述的Environment部门情况),方便后续演示:
const input = [ { "name": "Engineering", "radars": { "all": { "p1": { "count": 4 }, "p2": { "count": 1 }, "p3plus": { "count": 2 }, "total": { "count": 7 } } } }, { "name": "Environment", "radars": { "all": { "p3plus": { "count": 3 }, "total": { "count": 3 } } } }, // 再加个测试用例,模拟只有部分属性的情况 { "name": "HR", "radars": { "all": { "p1": { "count": 5 } } } } ];
接下来是核心的处理代码,用JavaScript实现:
const generateStatsResult = (departmentArray) => { // 定义我们需要统计的所有属性,要是想把p3plus改成p3+可以后续调整 const requiredStatsKeys = ['p1', 'p2', 'p3plus', 'total']; // 用reduce遍历数组,逐步构建键值对结果 return departmentArray.reduce((finalResult, currentDept) => { // 先拿到当前部门的all统计数据,没有的话用空对象兜底避免报错 const deptAllStats = currentDept.radars?.all || {}; // 为当前部门生成完整的统计对象,缺失的属性设为0 const deptCompleteStats = requiredStatsKeys.reduce((stats, key) => { stats[key] = deptAllStats[key]?.count || 0; return stats; }, {}); // 把部门名称作为键,统计对象作为值存入结果 finalResult[currentDept.name] = deptCompleteStats; return finalResult; }, {}); }; // 执行函数得到结果 const output = generateStatsResult(input); console.log(output);
运行这段代码后,你会得到这样的结果:
{ Engineering: { p1: 4, p2: 1, p3plus: 2, total: 7 }, Environment: { p1: 0, p2: 0, p3plus: 3, total: 3 }, HR: { p1: 5, p2: 0, p3plus: 0, total: 0 } }
额外说明和小调整
- 兼容旧环境:如果你的运行环境不支持ES2020的可选链
?.,可以换成传统的判断写法:// 替换deptAllStats的获取 const deptAllStats = (currentDept.radars && currentDept.radars.all) || {}; // 替换count的获取 stats[key] = (deptAllStats[key] && deptAllStats[key].count) || 0; - 把p3plus改成p3+:要是你希望结果里的键是
p3+而不是p3plus,可以加个映射关系:
这样结果里的键就会变成你想要的const keyMapping = { 'p1': 'p1', 'p2': 'p2', 'p3+': 'p3plus', 'total': 'total' }; const requiredStatsKeys = ['p1', 'p2', 'p3+', 'total']; // 内部reduce里改成 stats[key] = deptAllStats[keyMapping[key]]?.count || 0;p3+啦。
备注:内容来源于stack exchange,提问作者Aren Trot
相关产品推荐
相关产品推荐

