js实现分组函数
实现分组函数的基本思路
分组函数的核心逻辑是根据指定的键(key)将数组元素分类到不同的组中。JavaScript中可以通过对象或Map数据结构实现,键为分组依据,值为对应元素的数组。
使用reduce方法实现
通过Array.prototype.reduce遍历数组,动态构建分组对象:
function groupBy(array, key) {
return array.reduce((result, item) => {
const groupKey = typeof key === 'function'
? key(item)
: item[key];
(result[groupKey] = result[groupKey] || []).push(item);
return result;
}, {});
}
示例用法:
const data = [
{ category: 'fruit', name: 'apple' },
{ category: 'vegetable', name: 'carrot' },
{ category: 'fruit', name: 'banana' }
];
console.log(groupBy(data, 'category'));
// 输出: { fruit: [...], vegetable: [...] }
支持函数作为分组键
扩展实现支持通过函数计算分组键:
console.log(groupBy(data, item => item.name.length));
// 按名称长度分组
使用Map实现分组
需要保持键的顺序或键可能是对象时,使用Map更合适:
function groupByToMap(array, key) {
return array.reduce((map, item) => {
const groupKey = typeof key === 'function'
? key(item)
: item[key];
if (!map.has(groupKey)) map.set(groupKey, []);
map.get(groupKey).push(item);
return map;
}, new Map());
}
处理复杂分组条件
当需要多重分组时,可以组合多个分组条件:

function multiGroupBy(array, keys) {
return array.reduce((result, item) => {
const groupKey = keys.map(k =>
typeof k === 'function' ? k(item) : item[k]
).join('|');
(result[groupKey] = result[groupKey] || []).push(item);
return result;
}, {});
}
性能优化建议
对于大型数据集,使用Map比普通对象性能更好。如果分组键是固定且已知的,可以预初始化分组结构减少动态分配开销。






