如何基于fromTime和toTime对对象数组分组?解决lodash groupBy单参数限制
解决方案:基于多字段用Lodash的groupBy()分组
嘿,这事儿好办!你觉得_.groupBy()只能传单个字段参数?其实它的迭代函数可以返回任意能唯一标识分组的键——比如把fromTime和toTime组合起来,就能实现你要的分组效果。
具体实现步骤
- 用组合键分组:给
_.groupBy()传一个函数,返回包含fromTime和toTime的数组(Lodash支持用数组作为分组键,会自动转换成唯一的字符串标识)。 - 转换分组结构:把分组后的对象转换成你需要的数组格式,提取
days、time和sign字段。
完整代码示例
const _ = require('lodash'); // 或ES模块:import _ from 'lodash' // 原始数据 let data = [ {sign: 'open', day: 'mon', fromTime :'1:00 pm', toTime: '3:00 pm'}, {sign: 'open', day: 'tue', fromTime :'2:00 pm', toTime: '6:00 pm'}, {sign: 'open', day: 'wed', fromTime :'1:00 pm', toTime: '3:00 pm'}, {sign: 'open', day: 'thu', fromTime :'2:00 pm', toTime: '6:00 pm'} ]; // 第一步:基于fromTime和toTime分组 const groupedData = _.groupBy(data, item => [item.fromTime, item.toTime]); // 第二步:转换为目标格式 const updated = _.map(groupedData, (groupItems) => ({ days: groupItems.map(item => item.day), time: { fromTime: groupItems[0].fromTime, toTime: groupItems[0].toTime }, sign: groupItems[0].sign })); console.log(updated);
输出结果
运行后你会得到完全符合预期的结构:
[ { days: ['mon','wed'], time: { fromTime: '1:00 pm', toTime: '3:00 pm'}, sign:'open' }, { days: ['tue','thu'], time: { fromTime: '2:00 pm', toTime: '6:00 pm'}, sign:'open' } ]
补充说明
- 如果你担心数组键的兼容性,也可以用字符串拼接作为分组键,比如:
item =>${item.fromTime}|${item.toTime}``,效果完全一样,只是数组写法更直观。 - 示例中假设所有同时间组的
sign字段一致,如果有不一致的情况,可以根据需求调整(比如把sign也加入分组键,或者在转换时处理)。
内容的提问来源于stack exchange,提问作者Nevin
相关产品推荐
相关产品推荐

