
本文介绍如何遍历含嵌套 radars.all 结构的对象数组,将缺失字段(如 p1、p2 等)默认补 0,并按字段名横向聚合为 [ {P1: [...]}, {P2: [...]}, ... ] 形式的标准化结果。
本文介绍如何遍历含嵌套 `radars.all` 结构的对象数组,将缺失字段(如 `p1`、`p2` 等)默认补 0,并按字段名横向聚合为 `[ {p1: [...]}, {p2: [...]}, ... ]` 形式的标准化结果。
在实际数据处理中,我们常遇到不规则嵌套结构:每个对象的 radars.all 子对象可能只包含部分字段(如 p1、p3plus),缺失字段需视为 0;同时目标输出不是逐项展开,而是按字段维度纵向聚合——即所有对象的 p1.count 组成一个数组,所有 p2.count 组成另一个数组,最终以 { "P1": [4, 0, 0] } 等独立对象形式构成结果数组。
实现该逻辑推荐分两步:先归约(reduce)为字段映射对象,再转换为指定格式数组。这样既保证健壮性(自动处理缺失键),又便于扩展与调试。
✅ 第一步:用 reduce 构建字段 → 数值数组映射
我们初始化一个空对象 acc,遍历 input 每一项及其索引 idx,提取 curr.radars.all 中存在的键(如 "p1"、"total"),对每个键:
- 若
acc[key]未初始化,则创建长度为input.length的全0数组; - 将当前对象中该字段的
count值写入acc[key][idx]。
const aggregated = input.reduce((acc, curr, idx) => {
const allRadar = curr.radars?.all || {};
Object.keys(allRadar).forEach(key => {
// 确保 acc[key] 是长度为 input.length 的数组,初始全为 0
if (!acc[key]) {
acc[key] = Array(input.length).fill(0);
}
acc[key][idx] = allRadar[key]?.count ?? 0;
});
return acc;
}, {});
// 输出示例:{ p1: [4, 0, 0], p2: [1, 0, 0], p3plus: [2, 1, 0], total: [7, 1, 0] }⚠️ 注意:使用可选链
?.和空值合并??可安全处理radars或all不存在的情况,避免运行时错误。
✅ 第二步:映射为标题大写 + 数组对象格式
aggregated 是标准键值对象,只需按需重命名键并转为数组:
const output = Object.entries(aggregated)
.map(([key, values]) => {
const titleMap = {
p1: 'P1',
p2: 'P2',
p3plus: 'P3+',
total: 'Total'
};
return { [titleMap[key] || key.toUpperCase()]: values };
});
console.log(output);
// → [
// { "P1": [4, 0, 0] },
// { "P2": [1, 0, 0] },
// { "P3+": [2, 1, 0] },
// { "Total": [7, 1, 0] }
// ]? 完整可运行示例(含边界防护)
function transformRadarData(input) {
if (!Array.isArray(input)) return [];
const aggregated = input.reduce((acc, curr, idx) => {
const allRadar = curr?.radars?.all || {};
Object.keys(allRadar).forEach(key => {
if (!acc[key]) acc[key] = Array(input.length).fill(0);
acc[key][idx] = allRadar[key]?.count ?? 0;
});
return acc;
}, {});
const keyMapping = { p1: 'P1', p2: 'P2', p3plus: 'P3+', total: 'Total' };
return Object.entries(aggregated).map(([k, v]) => ({
[keyMapping[k] || k.toUpperCase()]: v
}));
}
// 使用
console.log(transformRadarData(input));✅ 总结:该方案兼顾清晰性与鲁棒性——reduce 天然适配“按字段累积”场景;显式键映射确保输出命名规范;防御性访问(?./??)覆盖数据稀疏性问题。如需新增字段(如 p4),仅需扩展 keyMapping 即可无缝支持。

















