js实现groupby
实现 JavaScript 的 groupBy 功能
在 JavaScript 中,groupBy 是一种常见的数据操作,用于将数组元素按照指定的键或条件分组。可以通过多种方式实现这一功能。
使用 Array.prototype.reduce 方法
通过 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 = [
{ id: 1, category: 'A' },
{ id: 2, category: 'B' },
{ id: 3, category: 'A' }
];
const groupedData = groupBy(data, 'category');
console.log(groupedData);
// 输出: { A: [{ id: 1, category: 'A' }, { id: 3, category: 'A' }], B: [{ id: 2, category: 'B' }] }
使用 Map 和 forEach 方法
如果需要更灵活的分组条件,可以使用 Map 结构结合 forEach 方法。
function groupBy(array, keyFn) {
const map = new Map();
array.forEach(item => {
const key = keyFn(item);
if (!map.has(key)) {
map.set(key, []);
}
map.get(key).push(item);
});
return Object.fromEntries(map);
}
// 示例用法
const groupedByCategory = groupBy(data, item => item.category);
console.log(groupedByCategory);
// 输出与上述示例相同
使用 Lodash 库
如果项目中已经使用了 Lodash,可以直接调用其 _.groupBy 方法,该方法功能强大且兼容性好。
const _ = require('lodash');
const groupedData = _.groupBy(data, 'category');
console.log(groupedData);
// 输出与上述示例相同
分组时处理复杂条件
分组不仅限于简单的属性值,还可以通过函数动态计算分组键。
const numbers = [1, 2, 3, 4, 5, 6];
const groupedByEvenOdd = groupBy(numbers, num => num % 2 === 0 ? 'even' : 'odd');
console.log(groupedByEvenOdd);
// 输出: { odd: [1, 3, 5], even: [2, 4, 6] }
注意事项
- 如果分组键为
undefined或null,需确保逻辑正确处理边界情况。 - 分组后的数据结构通常是对象,键为分组依据,值为数组形式的元素集合。
- 性能方面,
reduce和Map的实现方式在大数据量下表现较好。
以上方法涵盖了从原生 JavaScript 到第三方库的实现,可根据具体需求选择合适的方式。







