如何基于course、gradDate等多键组合对对象数组进行分组?
按多键组合分组对象数组
需要基于指定的键(如course、gradDate)的组合对对象数组进行分组,将具有相同键值组合的对象归为一组,最终得到分组后的数组用于循环生成用户报告。目前已能通过自定义函数获取各键的唯一值,但分组逻辑未实现。
解决方案代码
var uniqueKeys = ['course','gradDate']; var dataSet = [ { lastName:'Jones', course:'Standards', gradDate:'12/12/2022' }, { lastName:'Smith', course:'Standards', gradDate:'12/12/2022' }, { lastName:'Martinez', course:'Maths', gradDate:'12/12/2022' }, { lastName:'Santiago', course:'Photography', gradDate:'12/11/2022' }, { lastName:'Alexi', course:'Photography', gradDate:'12/11/2022' } ]; // 按指定键组合分组的核心函数 function groupByKeys(data, keys) { return Object.values(data.reduce((groups, item) => { // 用指定键的组合生成唯一分组标识 const groupKey = keys.map(key => item[key]).join('|'); // 初始化分组并添加当前对象 groups[groupKey] = groups[groupKey] || []; groups[groupKey].push(item); return groups; }, {})); } // 获取最终分组结果 var finalData = groupByKeys(dataSet, uniqueKeys);
代码说明
- 核心逻辑依赖
Array.reduce()遍历数据集,构建一个以键值组合字符串为键的分组对象,值为对应组的对象数组。 - 用
keys.map(key => item[key]).join('|')生成唯一标识,若键值本身包含|,可替换为其他无冲突分隔符(如###)。 - 最后通过
Object.values()提取分组对象的所有值,直接得到符合需求的二维数组结构。
运行结果
finalData的结构与预期完全一致:
[ [{ lastName: 'Jones', course: 'Standards', gradDate: '12/12/2022' }, { lastName: 'Smith', course: 'Standards', gradDate: '12/12/2022' } ], [{ lastName: 'Martinez', course: 'Maths', gradDate: '12/12/2022' }], [{ lastName: 'Santiago', course: 'Photography', gradDate: '12/11/2022' }, { lastName: 'Alexi', course: 'Photography', gradDate: '12/11/2022' } ] ]
内容的提问来源于stack exchange,提问作者Joel Ayoub
相关产品推荐
相关产品推荐

