如何用reduce合并对象数组生成指定结构?已写代码遇阻
问题:将对象数组按时间规则合并分组
我尝试用reduce把对象数组转成预期格式,目前实现了按validFrom字段分组,但后续推进不了,试了map也没效果,求帮忙。
输入数组
const inputArray = [ { "day": "Wednesday", "closeTime": "2000", "openTime": "0800", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": "Tuesday", "closeTime": "2000", "openTime": "0800", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": "Sunday", "closeTime": "1630", "openTime": "0845", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": "Thursday", "closeTime": "2000", "openTime": "0800", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": "Friday", "closeTime": "2000", "openTime": "0800", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": "Saturday", "closeTime": "1630", "openTime": "0845", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": "Monday", "closeTime": "2000", "openTime": "0800", "validFrom": "2001-09-19", "validTo": "2099-12-31" } ];
已用代码
let clubbedArray = normalData.reduce((acc, temp) => { let { validFrom, day } = temp; return {...acc, [validFrom]: [...(acc[validFrom] || []), day]}; }, {});
预期输出
[ { "day": [ "Friday", "Wednesday", "Monday", "Tuesday", "Thursday" ], "closeTime": "2000", "openTime": "0800", "validFrom": "2001-09-19", "validTo": "2099-12-31" }, { "day": [ "Saturday", "Sunday" ], "closeTime": "1630", "openTime": "0845", "validFrom": "2001-09-19", "validTo": "2099-12-31" } ]
解决方案
你的核心需求是按openTime、closeTime、validFrom、validTo这一组相同字段来合并day数组,之前的代码仅按validFrom分组,忽略了时间规则的组合,所以无法得到预期结果。
可以通过调整reduce的分组key来实现:
const result = Object.values(inputArray.reduce((acc, item) => { // 用所有公共字段组合作为分组标识,确保相同规则的项被分到同一组 const groupKey = `${item.openTime}-${item.closeTime}-${item.validFrom}-${item.validTo}`; if (!acc[groupKey]) { // 初始化分组对象,复制公共字段并将day设为空数组 acc[groupKey] = { ...item, day: [] }; } // 将当前项的day添加到分组的day数组中 acc[groupKey].day.push(item.day); return acc; }, {}));
代码说明
- 分组key设计:用
openTime+closeTime+validFrom+validTo的组合字符串作为key,确保只有完全相同的时间规则才会被合并。 - 初始化分组:当首次遇到某个分组key时,创建新的分组对象,复制当前项的公共字段,并初始化day数组。
- 合并day字段:后续遇到同组的项时,直接将day字段推入分组的day数组。
- 转换为数组:最后用
Object.values()将分组对象转换为数组,得到预期的输出格式。
内容的提问来源于stack exchange,提问作者GD19
相关产品推荐
相关产品推荐

