如何使用map或reduce方法将指定对象数组转换为目标结构数组?
解决方案
可以使用reduce结合Object.fromEntries实现需求,核心思路是先按日期分组收集事件类型,再根据分组结果生成目标结构。
完整代码示例
const October = [ { event_category: 'EVENT', date: '2022-10-02', detail: 'event' }, { event_category: 'TASK', date: '2022-10-03', detail: 'task' }, { event_category: 'EVENT', date: '2022-10-04', detail: 'event 1' }, { event_category: 'TASK', date: '2022-10-04', detail: 'task 1' }, { event_category: 'TASK', date: '2022-10-04', detail: 'task 2' }, ]; // 1. 按日期分组,收集每个日期下的所有事件类型(自动去重) const groupedByDate = October.reduce((acc, item) => { const { date, event_category } = item; if (!acc[date]) { acc[date] = new Set(); } acc[date].add(event_category); return acc; }, {}); // 2. 根据分组结果生成目标结构 const resultObject = Object.fromEntries( Object.entries(groupedByDate).map(([date, categories]) => { let combinedCategory; // 判断是否同时包含两种类型 if (categories.has('TASK') && categories.has('EVENT')) { combinedCategory = 'TASK_EVENT'; } else { // 单一类型直接取对应值 combinedCategory = [...categories][0]; } return [date, { event_category: combinedCategory, date }]; }) ); // 3. 包装成目标数组结构 const newOct = [resultObject]; console.log(newOct);
代码说明
- 分组阶段:用
reduce遍历原数组,以日期为键,通过Set存储对应事件类型,避免重复记录同一类型。 - 转换阶段:将分组对象转为键值对数组后遍历,根据类型集合判断最终分类:同时存在
TASK和EVENT则合并为TASK_EVENT,否则直接使用单一类型。 - 最终包装:将转换后的对象放入数组,得到目标结构。
内容的提问来源于stack exchange,提问作者mrbig
相关产品推荐
相关产品推荐

