如何正确对JS对象数组按字段分组聚合得到指定格式的结果数组
实现方案
可以用Array.prototype.reduce完成分组聚合,实现代码如下:
const arrayPat = [ {pat: '111', res: 'qwe', tag: '1'}, {pat: '111', res: 'sda', tag: '2'}, {pat: '111', res: 'xzc', tag: '3'}, {pat: '111', res: 'cej', tag: '4'}, {pat: '222', res: 'qwd', tag: '5'}, {pat: '222', res: 'asd', tag: '6'}, ] // 分组聚合逻辑 const groupMap = arrayPat.reduce((acc, curr) => { // 首次遇到对应pat时初始化分组,tag取组内第一个元素的值 if (!acc[curr.pat]) { acc[curr.pat] = { pat: curr.pat, res: [], tag: curr.tag } } // 把当前元素的res值推入对应分组的res数组 acc[curr.pat].res.push(curr.res) return acc }, {}) // 将分组映射的value提取为数组即为最终结果 const resultArray = Object.values(groupMap)
运行后resultArray的正确输出为:
[ { pat: '111', res: [ 'qwe', 'sda', 'xzc', 'cej' ], tag: '1' }, { pat: '222', res: [ 'qwd', 'asd' ], tag: '5' } ]
注:你给出的示例结果存在两处笔误:pat为222对应的res数组第一个元素应为
qwd而非qwe,tag应为组内第一个元素的5而非1,上述代码输出是符合需求描述的正确结果。
内容的提问来源于stack exchange,提问作者Roman Gavrilchuk
相关产品推荐
相关产品推荐

