我有这个代码片段,用于按关键字段进行分组。
它使用
reduce
函数,我理解代码,除了正在编辑函数的 result
或累加器的部分。
如果我要编写此代码,我将有一个外部空数组来将结果推送到而不是编辑函数中的对象。
代码按预期工作,但我想知道这是否是常见做法。
function groupBy(array, key) {
return array.reduce((result, currentItem) => {
const groupByKey = currentItem[key];
// Create a new array for the key if it doesn't exist in the result
if (!result[groupByKey]) {
result[groupByKey] = [];
}
// Push the current item to the array of the corresponding key
result[groupByKey].push(currentItem);
return result;
}, {});
}
// Example usage:
const data = [
{ id: 1, category: 'A' },
{ id: 2, category: 'B' },
{ id: 3, category: 'A' },
{ id: 4, category: 'C' },
{ id: 5, category: 'B' },
];
我相信尝试保持你的函数pure确实是一个很好的做法,尽管在这种情况下,这并不是什么大问题,因为累加器的初始值是
{}
,一个已经构建的对象文字专门传递给那个reduce
。
如果事先使用累加器,我会遇到问题,例如:
const data = {};
// some logic around data...
const reduce = array.reduce((acc, e) => { /* side-effects on acc */ }, data);
// data has changed
使用现代 JavaScript,您可能会使用本机方法,而不是创建自己的石斑鱼。
const data = [
{ id: 1, category: 'A' },
{ id: 2, category: 'B' },
{ id: 3, category: 'A' },
{ id: 4, category: 'C' },
{ id: 5, category: 'B' },
];
console.log(Object.groupBy(data, ({category}) => category));
但是,它在某些浏览器(例如三星互联网或 safari)中具有有限的可用性