使用Lodash groupBy按日期、客户端ID及流程日期分组(忽略时间)
解决方案:用Lodash groupBy + 自定义日期处理逻辑
没问题!你完全可以用lodash的groupBy配合自定义的分组键生成逻辑来实现,不用自定义pipe也能搞定。我给你一步步拆解解决方案:
核心思路
groupBy支持传入自定义分组键生成函数,我们可以在这个函数里对日期做格式化处理,提取出仅日期部分,再把多个分组维度(处理后的date、client.id、处理后的process.date)组合成一个唯一的分组键,这样就能实现多维度按日期分组的需求。
步骤1:写通用的日期处理工具函数
你的数组里有两种日期格式:ISO标准格式(比如2018-02-01T19:24:05.524+05:30)和MM-DD-YYYY HH:mm:ss格式(比如02-01-2018 11:54:05),我们需要一个函数把它们统一转换成仅包含日期部分的字符串(比如2018-02-01):
const extractDateOnly = (dateStr) => { // 处理ISO格式日期,截取T之前的纯日期部分 if (dateStr.includes('T')) { return dateStr.split('T')[0]; } // 处理MM-DD-YYYY格式日期,转换为YYYY-MM-DD统一格式 else { const [month, day, year] = dateStr.split(' ')[0].split('-'); return `${year}-${month}-${day}`; } };
步骤2:用Lodash groupBy实现多维度分组
接下来,我们把三个分组维度组合成一个唯一的键,传给groupBy:
import _ from 'lodash'; // 你的示例数组 const data = [ { "id":1, "date": "2018-02-01T19:24:05.524+05:30", "client":{ "id":1 }, "process":{ "id":1, "date":"02-01-2018 11:54:05" } }, { "id":2, "date": "2018-02-01T17:35:05.524+05:30", "client":{ "id":2 }, "process":{ "id":2, "date":"02-01-2018 11:54:05" } }, // 新增测试数据,验证分组逻辑 { "id":3, "date": "2018-02-02T10:00:00.000+05:30", "client":{ "id":1 }, "process":{ "id":3, "date":"02-02-2018 09:00:00" } } ]; // 执行分组:组合三个维度生成唯一键 const groupedData = _.groupBy(data, item => { const mainDate = extractDateOnly(item.date); const clientId = item.client.id; const processDate = extractDateOnly(item.process.date); // 用字符串拼接生成唯一分组键,格式可自定义 return `${mainDate}-client-${clientId}-process-${processDate}`; }); console.log(groupedData);
结果说明
运行代码后,groupedData会是一个结构化对象,键是我们组合的分组字符串,值是对应分组下的数组项:
2018-02-01-client-1-process-2018-02-01对应id=1的项2018-02-01-client-2-process-2018-02-01对应id=2的项2018-02-02-client-1-process-2018-02-02对应id=3的项
进阶:嵌套分组(可选)
如果你想要更清晰的层级结构(先按主date分,再按client.id分,最后按process.date分),可以嵌套使用groupBy:
// 嵌套分组:层级化展示分组结果 const nestedGrouped = _.groupBy(data, item => extractDateOnly(item.date)); Object.keys(nestedGrouped).forEach(dateKey => { nestedGrouped[dateKey] = _.groupBy(nestedGrouped[dateKey], item => item.client.id); Object.keys(nestedGrouped[dateKey]).forEach(clientId => { nestedGrouped[dateKey][clientId] = _.groupBy(nestedGrouped[dateKey][clientId], item => extractDateOnly(item.process.date)); }); });
这种结构更方便后续按层级访问分组数据。
内容的提问来源于stack exchange,提问作者Aakriti.G
相关产品推荐
相关产品推荐

