
本文详解如何将含重复 exco 值的扁平数据(如表格行)高效聚合为符合层级规范的嵌套 JSON 结构,使用 JavaScript reduce 与 find 实现分组、去重与嵌套构建。
本文详解如何将含重复 `exco` 值的扁平数据(如表格行)高效聚合为符合层级规范的嵌套 json 结构,使用 javascript `reduce` 与 `find` 实现分组、去重与嵌套构建。
在实际开发中,常需将数据库查询结果或 CSV 导入的扁平数据(每行代表一个原子记录)转换为具有业务语义的嵌套结构——例如按 exco 分组,每个 exco 对应多个 business,每个 business 下再关联若干 product。本例目标输出是一个 JSON 数组,其中每个元素包含 exco 字段及嵌套的 Businesses 数组,而每个 Businesses 元素又包含 business 名称和 Products 数组(即使当前每条记录仅对应一个 product,也需保持数组结构以支持扩展)。
以下是完整、可运行的实现方案:
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" }
];
const output = flatData.reduce((result, item) => {
const existingEntry = result.find(entry => entry.exco === item.exco);
if (existingEntry) {
// 已存在该 exco:追加新的 business + product
existingEntry.Businesses.push({
business: item.business,
Products: [{ product: item.product }]
});
} else {
// 首次出现该 exco:新建条目
result.push({
exco: item.exco,
Businesses: [{
business: item.business,
Products: [{ product: item.product }]
}]
});
}
return result;
}, []);
console.log(JSON.stringify(output, null, 2));
✅ 输出示例(格式化后):
[
{
"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" }]
}
]
}
]
⚠️ 注意事项:
- 字段名严格区分大小写(如 Businesses 首字母大写、Products 复数形式),请确保与下游系统约定一致;
- 若原始数据中存在同一 exco + 同一 business 的多条记录(即需合并 product),需额外去重或数组展开逻辑;
- 对于大数据量(>10,000 条),find() 在每次迭代中线性查找可能影响性能,建议改用 Map 或 Object 做 O(1) 索引优化;
- 如需兼容 IE 浏览器,请避免使用箭头函数及 const/let,或通过 Babel 转译。
此方法简洁、可读性强,是处理“一对多”层级聚合的经典模式,适用于 API 数据预处理、前端状态归一化及导出结构化 JSON 报表等典型场景。










