js实现groupby
实现 JavaScript 的 groupBy 功能
在 JavaScript 中,groupBy 是一种常见的数据操作,用于根据指定的键将数组元素分组。可以通过多种方式实现这一功能,以下是几种常见的方法:
使用 reduce 方法
reduce 是 JavaScript 数组的一个强大方法,非常适合用于分组操作。以下是一个示例:
function groupBy(arr, key) {
return arr.reduce((acc, obj) => {
const groupKey = obj[key];
if (!acc[groupKey]) {
acc[groupKey] = [];
}
acc[groupKey].push(obj);
return acc;
}, {});
}
// 示例用法
const data = [
{ id: 1, category: 'A' },
{ id: 2, category: 'B' },
{ id: 3, category: 'A' },
{ id: 4, category: 'B' }
];
const groupedData = groupBy(data, 'category');
console.log(groupedData);
输出结果:
{
A: [{ id: 1, category: 'A' }, { id: 3, category: 'A' }],
B: [{ id: 2, category: 'B' }, { id: 4, category: 'B' }]
}
使用 Map 和 Object.fromEntries
如果需要更现代的实现方式,可以结合 Map 和 Object.fromEntries:
function groupBy(arr, key) {
const map = new Map();
arr.forEach(obj => {
const groupKey = obj[key];
if (!map.has(groupKey)) {
map.set(groupKey, []);
}
map.get(groupKey).push(obj);
});
return Object.fromEntries(map);
}
使用 Lodash 库
如果项目中已经使用了 Lodash,可以直接使用其提供的 _.groupBy 方法:
const _ = require('lodash');
const data = [
{ id: 1, category: 'A' },
{ id: 2, category: 'B' },
{ id: 3, category: 'A' },
{ id: 4, category: 'B' }
];
const groupedData = _.groupBy(data, 'category');
console.log(groupedData);
按函数分组
如果需要更复杂的分组逻辑,可以传递一个函数作为键:
function groupBy(arr, keyFunc) {
return arr.reduce((acc, obj) => {
const groupKey = keyFunc(obj);
if (!acc[groupKey]) {
acc[groupKey] = [];
}
acc[groupKey].push(obj);
return acc;
}, {});
}
// 示例用法
const data = [
{ id: 1, value: 10 },
{ id: 2, value: 20 },
{ id: 3, value: 30 },
{ id: 4, value: 40 }
];
const groupedData = groupBy(data, item => item.value > 20 ? 'high' : 'low');
console.log(groupedData);
输出结果:

{
low: [{ id: 1, value: 10 }, { id: 2, value: 20 }],
high: [{ id: 3, value: 30 }, { id: 4, value: 40 }]
}
注意事项
- 如果分组的键值为
undefined或null,需要特别处理,避免分组失败。 - 对于大型数组,
reduce方法的性能通常优于循环遍历。
以上方法可以根据具体需求选择使用,纯 JavaScript 的实现适用于大多数场景,而 Lodash 提供了更简洁的 API。






