You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:08:51