如何修改groupBy函数,使其输出数组的数组而非对象数组
调整groupBy输出为数组的数组的解决方法
首先得明确你当前的groupBy返回的对象数组结构,比如是不是类似 [{ key: '分组键', values: [元素列表] }, ...] 这种?不管是用现成库改的还是自己实现的,都有两种简单的调整方式:
方式一:对现有结果做转换(适合不想改原groupBy函数的情况)
只需要分组后的元素列表(不含分组键)
如果你的目标是拿到每个分组里的元素数组组成的大数组,直接用map提取对应字段就行:
// 假设你的groupBy返回结果存在groupedObjects里 const arrayOfArrays = groupedObjects.map(groupItem => groupItem.values); // 这里的values替换成你实际的元素数组字段名 // 之后遍历调用你的函数就很方便 arrayOfArrays.forEach(group => yourTargetFunction(group));
需要保留分组键和对应元素数组
要是想把分组键也一起放进子数组里,同样用map把对象转成数组结构:
const arrayOfArraysWithKeys = groupedObjects.map(groupItem => [groupItem.key, groupItem.values]); // 遍历的时候可以解构传参 arrayOfArraysWithKeys.forEach(([groupKey, groupValues]) => yourTargetFunction(groupKey, groupValues));
方式二:直接修改groupBy函数(一劳永逸)
如果是你自己实现的groupBy,那直接在函数最后调整返回值就行,不用多一步转换:
function myGroupBy(data, getGroupKey) { const groups = {}; // 核心分组逻辑 data.forEach(item => { const key = getGroupKey(item); groups[key] = groups[key] || []; groups[key].push(item); }); // 这里直接返回数组的数组: // 只需要元素数组的话用Object.values return Object.values(groups); // 要带分组键的话用Object.entries,返回的就是[[键, 元素数组], ...] // return Object.entries(groups); } // 调用示例 const testData = [{ type: 'fruit', name: 'apple' }, { type: 'fruit', name: 'banana' }, { type: 'vegetable', name: 'carrot' }]; const groupedResult = myGroupBy(testData, item => item.type); // 直接遍历调用函数 groupedResult.forEach(group => yourTargetFunction(group));
这样调整后,输出的就是你需要的数组的数组,完全满足遍历传参的需求~
内容的提问来源于stack exchange,提问作者KVNA
相关产品推荐
相关产品推荐

