
本文介绍如何利用 JavaScript 的 reduce() 方法,将原始汽车数组按 category 字段高效分组,生成结构清晰的嵌套对象数组,兼顾可读性与性能。
本文介绍如何利用 javascript 的 `reduce()` 方法,将原始汽车数组按 `category` 字段高效分组,生成结构清晰的嵌套对象数组,兼顾可读性与性能。
在处理大规模数据时,避免多重遍历是提升性能的关键。针对按某一字段(如 category)对对象数组进行分组的需求,Array.prototype.reduce() 是最简洁且高效的原生方案——它仅需一次遍历即可完成分组与结构构建,时间复杂度为 O(n),远优于先提取唯一分类再循环过滤的 O(n²) 方案。
以下为推荐实现:
const CARS = [
{make: "skoda", model: "kodiaq", color: "light-blue", id: "1002", category: "A"},
{make: "skoda", model: "karoq", color: "green", id: "1008", category: "B"},
{make: "renault", model: "clio", color: "grey", id: "1006", category: "A"},
{make: "renault", model: "kangoo", color: "white", id: "1042", category: "C"},
{make: "mazda", model: "cx3", color: "red", id: "1022", category: "C"},
{make: "mazda", model: "cx30", color: "orange", id: "1106", category: "D"},
{make: "ford", model: "explorer", color: "grey", id: "1162", category: "B"},
{make: "ford", model: "edge", color: "red", id: "1862", category: "A"}
];
const NEW_CARS = CARS.reduce((acc, car) => {
const existingGroup = acc.find(group => group.category === car.category);
if (existingGroup) {
existingGroup.data.push(car);
} else {
acc.push({ category: car.category, data: [car] });
}
return acc;
}, []);✅ 优势说明:
- 单次遍历:每个元素仅访问一次,适合大数据量场景;
- 原生无依赖:无需引入 Lodash 等工具库;
- 结构可控:输出严格符合目标格式({ category, data: [...] });
- 内存友好:不创建中间数组,直接复用 accumulator。
⚠️ 注意事项:
- find() 在内部仍为线性查找,当分类数极多(如数百类)时,可进一步优化为 Map 辅助索引(见进阶方案);
- 原始数组中若存在 category 为 undefined 或空字符串的项,需提前清洗,否则会导致分组异常;
- 若需保持分类顺序与首次出现顺序一致(如本例中 A→B→C→D),当前方案天然满足;若需按字母序排列,最后可对 NEW_CARS 调用 sort((a, b) => a.category.localeCompare(b.category))。
? 进阶提示(超大分类场景):
对于万级数据+百级分类,可用 Map 提升查找效率至 O(1):
const NEW_CARS = Array.from(
CARS.reduce((map, car) => {
const key = car.category;
const group = map.get(key) || { category: key, data: [] };
group.data.push(car);
return map.set(key, group);
}, new Map()).values()
);该写法将整体复杂度稳定在 O(n),是生产环境处理高维分组任务的稳健选择。

















