js实现分组函数
实现分组函数的方法
在JavaScript中,分组函数通常指将数组元素按照特定条件分组,生成一个对象或Map,其中键是分组条件,值是对应的元素数组。以下是几种常见的实现方式:
使用Array.reduce()方法
通过reduce遍历数组,根据分组条件构建结果对象:

function groupBy(arr, key) {
return arr.reduce((acc, item) => {
const groupKey = typeof key === 'function' ? key(item) : item[key];
(acc[groupKey] = acc[groupKey] || []).push(item);
return acc;
}, {});
}
// 示例用法
const data = [
{ category: 'fruit', name: 'apple' },
{ category: 'vegetable', name: 'carrot' },
{ category: 'fruit', name: 'banana' }
];
console.log(groupBy(data, 'category'));
// 输出: { fruit: [...], vegetable: [...] }
使用Map数据结构
如果需要保持分组键的顺序或键可能是非字符串类型,可以使用Map:

function groupByToMap(arr, keyFn) {
const map = new Map();
arr.forEach(item => {
const key = keyFn(item);
if (!map.has(key)) map.set(key, []);
map.get(key).push(item);
});
return map;
}
// 示例用法
console.log(groupByToMap(data, item => item.category));
按多个条件复合分组
实现多级分组,例如先按category再按subCategory:
function multiGroupBy(arr, keys) {
return arr.reduce((acc, item) => {
const keyPath = keys.map(k => item[k]).join('|');
(acc[keyPath] = acc[keyPath] || []).push(item);
return acc;
}, {});
}
性能优化版本
对于大数据量,可优化分组过程:
function optimizedGroupBy(arr, key) {
const result = Object.create(null);
for (let i = 0; i < arr.length; i++) {
const item = arr[i];
const groupKey = typeof key === 'function' ? key(item) : item[key];
let group = result[groupKey];
if (group) {
group.push(item);
} else {
result[groupKey] = [item];
}
}
return result;
}
注意事项
- 如果分组键可能为
undefined或null,需要特殊处理 - 大型数组分组时,考虑使用
for循环代替reduce以获得更好性能 - 分组函数可以是字符串属性名,也可以是返回分组键的函数
以上方法覆盖了大多数分组场景,可根据具体需求选择合适实现方式。






