如何用Lodash按dayNumber将数组分组为指定嵌套结构?
按dayNumber字段分组为嵌套结构(Lodash实现)
原始数据
[ { "Pnl": 29.0035635, "date": "11/14/2022", "dayNumber": 1, "translationDayOfWeek": "Monday" }, { "Pnl": 50.8878545, "date": "11/08/2022", "dayNumber": 2, "translationDayOfWeek": "Tuesday" }, { "Pnl": 73.1014552, "date": "11/08/2022", "dayNumber": 2, "translationDayOfWeek": "Tuesday" }, { "Pnl": 32.477, "date": "11/08/2022", "dayNumber": 6, "translationDayOfWeek": "Saturday" }, { "Pnl": 25.43999561, "date": "09/30/2022", "dayNumber": 5, "translationDayOfWeek": "Friday" }, { "Pnl": 17.6294068, "date": "09/30/2022", "dayNumber": 1, "translationDayOfWeek": "Monday" } ]
期望输出
[ { "dayNumber": 1, "orders": [ { "Pnl": 29.0035635, "date": "11/14/2022", "dayNumber": 1, "translationDayOfWeek": "Monday" }, { "Pnl": 17.6294068, "date": "09/30/2022", "dayNumber": 1, "translationDayOfWeek": "Monday" } ] }, { "dayNumber": 2, "orders": [ { "Pnl": 50.8878545, "date": "11/08/2022", "dayNumber": 2, "translationDayOfWeek": "Tuesday" }, { "Pnl": 73.1014552, "date": "11/08/2022", "dayNumber": 2, "translationDayOfWeek": "Tuesday" } ] } ]
实现方案
结合Lodash的_.groupBy()和_.map()方法即可完成需求,步骤如下:
- 用
_.groupBy()按dayNumber字段对原始数组分组,得到以dayNumber为键、对应数据数组为值的对象 - 用
_.map()遍历分组后的对象,转换成包含dayNumber和orders的目标结构
代码示例:
const _ = require('lodash'); const originalData = [/* 上述原始数据数组 */]; // 基础分组转换 const groupedData = _.map(_.groupBy(originalData, 'dayNumber'), (orders, dayNumber) => ({ dayNumber: parseInt(dayNumber, 10), orders })); // 如果需要只保留包含多条订单的分组(匹配示例输出) const filteredGroupedData = groupedData.filter(item => item.orders.length > 1); console.log(filteredGroupedData);
代码说明
_.groupBy(originalData, 'dayNumber'):将原始数组按dayNumber分组,返回{ '1': [...], '2': [...] }格式的对象_.map(...):遍历分组后的对象,把字符串类型的dayNumber转为数字,同时将对应数据数组赋值给orders字段,生成目标格式的数组- 后续的
filter方法可选,用于筛选出包含多条订单的分组,和示例输出一致
内容的提问来源于stack exchange,提问作者ChahinDev
相关产品推荐
相关产品推荐

