如何在Node.js中按多个键分组JSON数组?含Underscore/Lodash方案
在Node.js中按多键分组JSON数组的方案
没问题,我来帮你搞定这个分组合并的需求!针对你给出的示例,我们可以通过原生JavaScript、Lodash或Underscore三种方式实现,下面逐个说明:
一、原生JavaScript方案
原生JS用Array.reduce()就能轻松实现,核心思路是遍历数组时以目标键(比如示例里的key)作为分组标识,逐步合并同组对象的属性:
const data = [{ key: '2017-1', y: 1, gkey: 'y' }, { key: '2017-1', x: 1, gkey: 'x' }]; const grouped = Object.values(data.reduce((acc, item) => { // 以key作为分组的唯一标识 const groupKey = item.key; // 如果该分组不存在,先初始化一个包含key的空对象 if (!acc[groupKey]) { acc[groupKey] = { key: groupKey }; } // 合并当前对象的属性(排除gkey) Object.keys(item).forEach(key => { if (key !== 'gkey') { acc[groupKey][key] = item[key]; } }); return acc; }, {})); console.log(grouped); // 输出:[{ key: '2017-1', y: 1, x: 1 }]
如果需要按多个键分组(比如同时按key和另一个字段),只需要把groupKey改成多个键的组合字符串,比如${item.key}-${item.anotherKey}即可。
二、Lodash方案
Lodash提供了更简洁的工具函数组合,用_.groupBy()分组后,再用_.mapValues()结合_.merge()来合并同组对象:
const _ = require('lodash'); const data = [{ key: '2017-1', y: 1, gkey: 'y' }, { key: '2017-1', x: 1, gkey: 'x' }]; // 先按key分组,再合并每组内的对象(排除gkey) const grouped = _.mapValues(_.groupBy(data, 'key'), group => { return _.reduce(group, (result, item) => { // 合并时忽略gkey字段 return _.merge(result, _.omit(item, 'gkey')); }, {}); }); // 转成数组格式(和示例期望结果一致) const result = Object.values(grouped); console.log(result); // 输出:[{ key: '2017-1', y: 1, x: 1 }]
如果要按多键分组,把_.groupBy(data, 'key')改成_.groupBy(data, item => [item.key, item.anotherKey].join('-'))即可,这样就能同时按多个字段分组。
三、Underscore方案
Underscore的思路和原生JS类似,利用_.groupBy()分组后,再用_.map()和_.extend()来合并属性:
const _ = require('underscore'); const data = [{ key: '2017-1', y: 1, gkey: 'y' }, { key: '2017-1', x: 1, gkey: 'x' }]; // 按key分组 const grouped = _.groupBy(data, 'key'); // 处理每个分组,合并属性 const result = _.map(grouped, group => { return _.reduce(group, (acc, item) => { // 复制item的属性到acc,排除gkey return _.extend(acc, _.omit(item, 'gkey')); }, {}); }); console.log(result); // 输出:[{ key: '2017-1', y: 1, x: 1 }]
多键分组的话,同样修改_.groupBy的分组函数,用多个键组合成唯一标识即可。
内容的提问来源于stack exchange,提问作者Jamal Abo
相关产品推荐
相关产品推荐

