
本文介绍如何遍历含嵌套 radars.all 结构的对象数组,提取 p1/p2/p3plus/total 的 count 值,并重组为每个字段对应一个数值数组的标准化键值结构(如 { "P1": [4, 0, 0] })。
本文介绍如何遍历含嵌套 `radars.all` 结构的对象数组,提取 `p1`/`p2`/`p3plus`/`total` 的 `count` 值,并重组为每个字段对应一个数值数组的标准化键值结构(如 `{ "p1": [4, 0, 0] }`。
在实际数据处理中,常遇到类似场景:原始数据以“类别维度”组织(如 Engineering、Environment),但分析或可视化需求要求转为“指标维度”——即每个指标(P1、P2、P3+、Total)独立成列,其值为各分类对应的计数。由于源数据中某些字段可能完全缺失(如 Environment 中无 p1 字段),需默认补 0,这使得简单 map 或 forEach 难以直接满足。
推荐使用 reduce + 显式键映射 方案,兼顾健壮性与可读性。核心思路是:
- 初始化一个空对象
acc,用于累积各指标的数组; - 遍历输入数组,对每个元素获取其
radars.all的所有键(如"p1"、"p3plus"); - 对每个键,确保
acc[key]是长度为input.length的数组(缺失则用Array(input.length).fill(0)初始化); - 将当前索引
idx处的count值写入对应数组位置; - 最后通过
Object.keys().map()将扁平对象转为目标格式的数组。
以下是完整实现代码:
const input = [
{
"name": "Engineering",
"radars": {
"all": {
"p1": { "count": 4 },
"p2": { "count": 1 },
"p3plus": { "count": 2 },
"total": { "count": 7 }
}
}
},
{
"name": "Environment",
"radars": {
"all": {
"p3plus": { "count": 1 },
"total": { "count": 1 }
}
}
},
{
"name": "others",
"radars": {
"all": {}
}
}
];
// 步骤1:归约生成指标映射对象 { p1: [4,0,0], p2: [1,0,0], ... }
const aggregated = input.reduce((acc, curr, idx) => {
const allRadars = curr.radars?.all || {};
Object.keys(allRadars).forEach(key => {
// 确保 acc[key] 存在且为正确长度的数组
if (!acc[key]) {
acc[key] = Array(input.length).fill(0);
}
acc[key][idx] = allRadars[key]?.count ?? 0;
});
return acc;
}, {});
// 步骤2:映射为题目要求的数组格式 [{ "P1": [...] }, { "P2": [...] }, ...]
// 注意:按业务需求统一键名大小写与符号(如 p3plus → P3+)
const output = Object.entries(aggregated)
.map(([key, values]) => {
const normalizedKey = key === 'p1' ? 'P1' :
key === 'p2' ? 'P2' :
key === 'p3plus' ? 'P3+' : 'Total';
return { [normalizedKey]: values };
});
console.log(output);
// 输出:
// [
// { "P1": [4, 0, 0] },
// { "P2": [1, 0, 0] },
// { "P3+": [2, 1, 0] },
// { "Total": [7, 1, 0] }
// ]
✅ 关键注意事项:
- 使用可选链
?.和空值合并??防御radars.all或count不存在导致的运行时错误; - 初始化数组时使用
Array(input.length).fill(0)确保每个指标数组长度严格匹配输入项数,避免索引错位; - 键名标准化(如
p3plus→P3+)应在最终映射阶段完成,保持中间逻辑清晰; - 若后续需支持动态指标(不止
p1/p2/p3plus/total),可预定义const validKeys = ['p1', 'p2', 'p3plus', 'total'];并在forEach前过滤,提升可控性。
该方案时间复杂度为 O(n×m)(n 为输入长度,m 为单个 all 对象平均键数),空间复杂度 O(k×n)(k 为唯一指标数),高效且易于维护。










