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

如何用Lodash groupBy或ES7按指定条件对数组分组

实现按条件分组的两种方案

我来帮你搞定这个数组分组的需求!核心逻辑是优先用details.ref作为分组键,没有ref的情况下用details.name,下面分别用Lodash和原生ES7+特性实现,完全匹配你要的结构:

方案一:使用Lodash的groupBy

Lodash的groupBy方法可以直接传入一个自定义函数来指定分组键,写法非常简洁:

const _ = require('lodash');

const originalArray = [ 
  { "name":"Rue Pierre", "details":{ "name":"Rue Pierre" } }, 
  { "name":"Rue de Wavrin", "details":{ "ref":"D 241", "name":"Rue de Wavrin" } }, 
  { "name":"Rue de paris", "details":{ "ref":"D 241", "name":"Rue de paris" } } 
];

const grouped = _.groupBy(originalArray, (item) => {
  // 优先取details.ref,没有则取details.name作为分组键
  return item.details.ref || item.details.name;
});

console.log(grouped);

执行后得到的结果就是你想要的结构:

{ 
  "Rue Pierre": [ { "name": "Rue Pierre", "details": { "name": "Rue Pierre" }} ], 
  "D 241": [ 
    {"name": "Rue de Wavrin", "details": {"ref": "D 241", "name": "Rue de Wavrin"}}, 
    {"name": "Rue de paris", "details": {"ref": "D 241", "name": "Rue de paris"}} 
  ] 
}

方案二:原生ES7+实现(无需Lodash)

如果不想引入第三方库,用数组的reduce方法就能搞定,逻辑和Lodash版本完全一致:

const originalArray = [ 
  { "name":"Rue Pierre", "details":{ "name":"Rue Pierre" } }, 
  { "name":"Rue de Wavrin", "details":{ "ref":"D 241", "name":"Rue de Wavrin" } }, 
  { "name":"Rue de paris", "details":{ "ref":"D 241", "name":"Rue de paris" } } 
];

const grouped = originalArray.reduce((acc, item) => {
  const key = item.details.ref || item.details.name;
  // 如果当前分组键不存在,先初始化一个空数组
  if (!acc[key]) {
    acc[key] = [];
  }
  // 将当前元素推入对应的分组数组
  acc[key].push(item);
  return acc;
}, {});

console.log(grouped);

小提示

你给出的结果里第一个元素的details.name似乎有笔误(原数据是Rue Pierre,结果里变成了Rue Pierre Gilles de Gennes),如果需要修改这个字段,可以在分组时额外处理——比如在push之前修改item.details.name,或者创建一个新对象避免修改原数据。

内容的提问来源于stack exchange,提问作者seb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:30:14