
本文介绍如何使用 JavaScript 的 reduce 和 find 方法,将含重复主键(如 exco)的扁平数组高效聚合成符合业务层级结构的嵌套 JSON 对象数组,支持多级嵌套(exco → Businesses → Products)。
本文介绍如何使用 javascript 的 `reduce` 和 `find` 方法,将含重复主键(如 `exco`)的扁平数组高效聚合成符合业务层级结构的嵌套 json 对象数组,支持多级嵌套(exco → businesses → products)。
在实际开发中,我们常需将数据库导出或 API 返回的“宽表式”扁平数据(每行一个原子记录)转换为具有逻辑分组关系的嵌套结构。例如,将按 exco 分组、每个 exco 下包含多个 business、每个 business 关联若干 product 的数据,组织成标准 JSON 格式,便于前端渲染树形组件或后端微服务间通信。
以下是一个典型示例:原始数据为四条扁平记录:
const flatData = [
{ exco: 10, business: "Europe", product: "shampooA" },
{ exco: 10, business: "USA", product: "shampooB" },
{ exco: 20, business: "India", product: "watch" },
{ exco: 30, business: "China", product: "fans" }
];
目标输出是每个唯一 exco 对应一个顶层对象,其 Businesses 字段为数组,每个子项含 business 字符串和 Products 数组(即使单个产品也包裹为数组),结构如下:
[
{
"exco": 10,
"Businesses": [
{ "business": "Europe", "Products": [{ "product": "shampooA" }] },
{ "business": "USA", "Products": [{ "product": "shampooB" }] }
]
},
{
"exco": 20,
"Businesses": [
{ "business": "India", "Products": [{ "product": "watch" }] }
]
},
{
"exco": 30,
"Businesses": [
{ "business": "China", "Products": [{ "product": "fans" }] }
]
}
]
实现的核心逻辑是按 exco 聚合 + 按 business 追加子项。推荐使用 Array.prototype.reduce() 配合 Array.prototype.find():
const output = flatData.reduce((acc, item) => {
// 查找是否已有相同 exco 的分组对象
const group = acc.find(obj => obj.exco === item.exco);
if (group) {
// 存在则追加新的 business 条目(注意:此处未对 business 去重,如需合并同 business 多 product,请进一步扩展)
group.Businesses.push({
business: item.business,
Products: [{ product: item.product }]
});
} else {
// 不存在则新建分组
acc.push({
exco: item.exco,
Businesses: [{
business: item.business,
Products: [{ product: item.product }]
}]
});
}
return acc;
}, []);
console.log(JSON.stringify(output, null, 2));
✅ 关键说明与注意事项:
- 该方案假设同一 exco 下不同 business 值互异;若存在重复 business(如两条 exco=10, business="Europe"),当前逻辑会生成两条独立 Businesses 项;如需合并相同 business 下的 product,应在 push 前再次 find 对应 business 并 push 到其 Products 数组。
- 属性名大小写敏感:示例中使用了 Businesses(首字母大写)和 Products(P 大写),请严格匹配目标 Schema;若需兼容 REST API 规范(小驼峰),可改为 businesses / products。
- 性能提示:对于超大数据集(>10k 行),find() 在每次迭代中线性查找可能影响性能;此时建议先用 Map 建立 exco → index 索引,或改用两次遍历(groupBy + 映射)提升效率。
- 最终输出为 JavaScript 对象数组;调用 JSON.stringify(output) 即可获得标准 JSON 字符串,适用于 fetch 请求体或文件导出。
通过此方法,你可灵活适配各类层级聚合需求——只需调整嵌套层级与字段映射,即可将任意二维扁平数据转化为语义清晰、结构规范的嵌套 JSON。











