
本文详解如何使用 JavaScript 的 reduce 和 find 方法,将包含重复 exco 值的扁平数组(如多条记录共享同一 exco)高效聚合成符合业务层级的嵌套 JSON 结构:每个 exco 对应一个顶层对象,其 Businesses 字段为数组,每项含 business 名称及嵌套的 Products 数组。
本文详解如何使用 javascript 的 `reduce` 和 `find` 方法,将包含重复 `exco` 值的扁平数组(如多条记录共享同一 `exco`)高效聚合成符合业务层级的嵌套 json 结构:每个 `exco` 对应一个顶层对象,其 `businesses` 字段为数组,每项含 `business` 名称及嵌套的 `products` 数组。
在实际数据处理中,常需将关系型或表格型扁平数据(如 CSV 导入、数据库查询结果)转换为具有层级语义的嵌套 JSON 结构。例如,原始数据中多个产品可能归属同一 exco 编号但不同地区(business),目标是按 exco 分组,再按 business 聚合产品列表。
以下为标准实现方案:
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 existingItem = result.find(x => x.exco === item.exco);
if (existingItem) {
// 同一 exco 已存在 → 追加新的 business 及其 product
existingItem.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),需与目标结构一致;
- 每个 business 对应独立的 Products 数组(即使单个产品也包裹为数组),便于后续扩展;
- 时间复杂度为 O(n²),适用于中小型数据集(
- 注意原始数据中 business 值存在拼写不一致(如 "china."、"India."),预处理时应统一清洗(.trim() + 标准化大小写)。
该模式可灵活扩展:如需支持同一 business 下多个 product,只需将 Products 初始化为空数组,并在匹配到已有 business 时 push 而非覆盖;亦可结合 groupBy 工具函数提升可读性与复用性。











