js实现groupby
实现 JavaScript 的 groupBy 功能
在 JavaScript 中实现 groupBy 功能可以将数组中的元素按照指定的条件分组。以下是几种常见的实现方式:

使用 Array.prototype.reduce
function groupBy(array, key) {
return array.reduce((acc, obj) => {
const groupKey = typeof key === 'function' ? key(obj) : obj[key];
if (!acc[groupKey]) {
acc[groupKey] = [];
}
acc[groupKey].push(obj);
return acc;
}, {});
}
// 示例用法
const data = [
{ id: 1, category: 'fruit', name: 'apple' },
{ id: 2, category: 'vegetable', name: 'carrot' },
{ id: 3, category: 'fruit', name: 'banana' }
];
const grouped = groupBy(data, 'category');
console.log(grouped);
使用 ES6 Map 对象
function groupBy(array, key) {
const map = new Map();
array.forEach(item => {
const groupKey = typeof key === 'function' ? key(item) : item[key];
if (!map.has(groupKey)) {
map.set(groupKey, []);
}
map.get(groupKey).push(item);
});
return Object.fromEntries(map);
}
// 示例用法同上
支持函数作为分组条件
function groupBy(array, keyFunc) {
return array.reduce((acc, item) => {
const key = typeof keyFunc === 'function' ? keyFunc(item) : item[keyFunc];
(acc[key] = acc[key] || []).push(item);
return acc;
}, {});
}
// 示例用法:按名称长度分组
const groupedByLength = groupBy(data, item => item.name.length);
Lodash 的实现方式
如果项目中使用 Lodash 库,可以直接使用其 _.groupBy 方法:

const _ = require('lodash');
const grouped = _.groupBy(data, 'category');
TypeScript 版本
function groupBy<T>(array: T[], key: keyof T | ((item: T) => string)): Record<string, T[]> {
return array.reduce((acc: Record<string, T[]>, item: T) => {
const groupKey = typeof key === 'function' ? key(item) : item[key] as string;
(acc[groupKey] = acc[groupKey] || []).push(item);
return acc;
}, {});
}
性能考虑
对于大型数据集,reduce 方法通常比 forEach 或 for 循环有更好的性能表现。如果需要处理非常大的数组,可以考虑使用 Web Workers 或分批处理技术。
浏览器兼容性
现代浏览器都支持上述实现方法。如果需要支持旧版浏览器,可能需要添加 polyfill 或使用 Babel 转译代码。






