
本文详解如何将嵌套在 keyResults 和 metrics 中的对象,按 product 字段统一归类,生成结构清晰、按产品聚合的新对象数组,适用于数据聚合、报表生成等典型场景。
本文详解如何将嵌套在 `keyresults` 和 `metrics` 中的对象,按 `product` 字段统一归类,生成结构清晰、按产品聚合的新对象数组,适用于数据聚合、报表生成等典型场景。
在实际开发中,常需将分散在多个子数组(如 keyResults、metrics)中的对象,依据某个公共字段(如 product)进行逻辑分组,并保持原始结构语义——即每个产品对应独立的 keyResults 和 metrics 子数组。这并非简单的数组扁平化或排序,而是跨字段的键驱动聚合(key-based cross-array grouping)。
核心思路是:
✅ 遍历所有目标子数组(keyResults 和 metrics);
✅ 提取每项的 product 值作为分组键;
✅ 使用普通对象({})作为临时哈希表,以 product 为 key 存储分组结果;
✅ 每次遇到新 product 时初始化其结构(含空 keyResults 和 metrics 数组);
✅ 将当前项推入对应 product 下的对应子数组;
✅ 最终通过 Object.values() 转为标准数组,消除键名依赖,符合预期输出格式。
以下为完整可运行实现:
const a = {
products: {
keyResults: [
{ leader: "Aaron", product: "Product 1" },
{ leader: "Addie", product: "Product 1" },
{ leader: "Mindy", product: "Product 1" },
{ leader: "Wiley", product: "Product 2" }
],
metrics: [
{ leader: "Aaron", product: "Product 1" },
{ leader: "Wiley", product: "Product 2" }
]
}
};
// 步骤 1:创建分组哈希表
const groupedByProduct = {};
// 步骤 2:遍历 keyResults 和 metrics 两个字段
for (const category of ['keyResults', 'metrics']) {
const items = a.products[category];
if (!Array.isArray(items)) continue;
for (const item of items) {
const productId = item.product;
// 若该 product 尚未初始化,则创建默认结构
if (!groupedByProduct[productId]) {
groupedByProduct[productId] = {
product: productId,
keyResults: [],
metrics: []
};
}
// 将当前 item 推入对应 category 的子数组
groupedByProduct[productId][category].push(item);
}
}
// 步骤 3:转换为 products 数组
const b = {
products: Object.values(groupedByProduct)
};
console.log(b);
// 输出结构完全匹配预期:每个 product 对应独立的 keyResults/metrics 数组? 关键注意事项:
- 健壮性处理:代码中添加了 if (!Array.isArray(items)) continue 判断,避免因字段缺失或类型异常导致运行时错误;
- 不可变性考量:此方案不修改原对象 a,符合函数式编程推荐实践;
- 扩展性友好:如后续新增 benchmarks 等同类字段,只需在 ['keyResults', 'metrics'] 数组中追加即可,无需重写逻辑;
- 性能优势:时间复杂度为 O(n),其中 n 是所有子数组元素总数,远优于多次 filter() 或嵌套 reduce() 的方案;
- 兼容性保障:仅使用 ES5+ 原生语法,无需依赖 Lodash 或其他库,适合各类运行环境(浏览器、Node.js、小程序等)。
✅ 总结:当面对多源同构数组(字段结构一致、语义相关)需按某字段归并时,“哈希表预分配 + 分类注入 + Object.values() 提取” 是最直观、高效且易维护的模式。它规避了 reduce 的嵌套复杂度,也比 Map 更简洁(无需处理迭代器),是 JavaScript 数据聚合的经典范式。
立即学习“Java免费学习笔记(深入)”;


















