插件窝 干货文章 JavaScript数组如何高效分组并转换成对象?

JavaScript数组如何高效分组并转换成对象?

category 数组 方法 分组 664    来源:    2025-03-21

在JavaScript中,如果你有一个数组,并且想要将其分组并转换为对象,可以使用reduce方法来实现。reduce方法非常适合处理这种需要累积或转换数据的场景。

假设你有一个数组,数组中的每个元素都是一个对象,你想要根据某个属性(例如category)来分组,并将结果转换为一个对象,其中键是分组的属性值,值是对应的数组元素。

示例代码

const items = [
  { id: 1, category: 'fruit', name: 'apple' },
  { id: 2, category: 'fruit', name: 'banana' },
  { id: 3, category: 'vegetable', name: 'carrot' },
  { id: 4, category: 'vegetable', name: 'broccoli' },
  { id: 5, category: 'fruit', name: 'orange' }
];

const groupedItems = items.reduce((acc, item) => {
  const { category } = item;
  if (!acc[category]) {
    acc[category] = [];
  }
  acc[category].push(item);
  return acc;
}, {});

console.log(groupedItems);

输出结果

{
  fruit: [
    { id: 1, category: 'fruit', name: 'apple' },
    { id: 2, category: 'fruit', name: 'banana' },
    { id: 5, category: 'fruit', name: 'orange' }
  ],
  vegetable: [
    { id: 3, category: 'vegetable', name: 'carrot' },
    { id: 4, category: 'vegetable', name: 'broccoli' }
  ]
}

代码解释

  1. reduce方法reduce方法接受一个回调函数和一个初始值(在这个例子中是空对象{})。回调函数有两个参数:

    • acc:累积器,初始值为{},在每次迭代中都会更新。
    • item:当前正在处理的数组元素。
  2. 解构赋值const { category } = item; 从当前元素中提取category属性。

  3. 检查并初始化分组:如果累积器acc中还没有当前category的键,则初始化一个空数组。

  4. 将元素添加到对应的分组:将当前元素item推入对应的分组数组中。

  5. 返回累积器:在每次迭代结束时返回累积器acc,以便在下一次迭代中使用。

性能考虑

  • 时间复杂度reduce方法的时间复杂度是O(n),其中n是数组的长度。每个元素只会被处理一次,因此这种方法是非常高效的。
  • 空间复杂度:空间复杂度也是O(n),因为最终的结果对象会包含所有原始数组的元素。

其他方法

如果你想要更简洁的代码,也可以使用forEach方法来实现相同的功能:

const groupedItems = {};
items.forEach(item => {
  const { category } = item;
  if (!groupedItems[category]) {
    groupedItems[category] = [];
  }
  groupedItems[category].push(item);
});

console.log(groupedItems);

这种方法与reduce方法的效果相同,但代码风格略有不同。

总结

使用reduce方法可以高效地将数组分组并转换为对象。这种方法不仅代码简洁,而且性能良好,适合处理大多数分组转换的需求。