如何用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
相关产品推荐
相关产品推荐

