基于匹配值从两个数组创建(多维)数组的实现方法
基于日期匹配生成目标数组的实现方案
我明白你现在卡在怎么把这两个数组按日期匹配生成目标数组上了,别担心,我来给你一步步拆解实现思路和代码示例。
首先先明确我们的目标:遍历date数组里的每个日期,找到所有在该日期有可用时段的人员信息,最终生成一个每个日期对应其可用人员列表的目标数组。
实现步骤
- 第一步:先把
people数组转换成日期为键、对应人员可用信息为值的映射对象,这样后续查找时不用反复遍历整个people数组,效率更高。 - 第二步:遍历
date数组,针对每个日期从映射对象中取出对应的人员信息,组合成目标数组的元素。
具体代码示例
// 你的原始数据 let date = [1522303200000, 1522389600000, 1522476000000]; let people = [ { "id": 0, "name": "Sophia Mason", "biography": "Lorem ...", "availability": [ { "date": 1522303200000, "times": ["9:00 am", "2:30 pm", "5:00 pm", "6:00 pm"] }, { "date": 1522389600000, "times": ["9:00 am", "2:30 pm", "5:00 pm", "6:00 pm"] }, { "date": 1522476000000, "times": ["9:00 am", "3:00 pm"] } ] }, // 可以添加更多人员数据 ]; // 1. 构建日期到人员可用信息的映射 const dateToPeopleMap = people.reduce((map, person) => { // 遍历当前人员的所有可用日期 person.availability.forEach(availItem => { // 如果映射里还没有这个日期的条目,先初始化空数组 if (!map[availItem.date]) { map[availItem.date] = []; } // 把当前人员的关键信息(id、name、该日期的可用时段)加入对应日期的列表 map[availItem.date].push({ id: person.id, name: person.name, availableTimes: availItem.times }); }); return map; }, {}); // 2. 遍历date数组生成目标数组 const targetArray = date.map(currentDate => ({ date: currentDate, availablePersons: dateToPeopleMap[currentDate] || [] // 处理边界情况:如果该日期没有任何人可用,返回空数组避免报错 })); // 打印结果看看 console.log(targetArray);
代码解释
reduce方法用来遍历people数组,把每个人员的availability里的日期和对应信息整理到映射对象中,这样后续查找日期对应的人员时是O(1)的时间复杂度。map方法遍历date数组的每个日期,从映射中取出对应的人员列表,如果该日期没有人员可用,就用空数组兜底,保证目标数组的结构一致性。
示例输出结构
生成的targetArray大概会是这样的结构:
[ { "date": 1522303200000, "availablePersons": [ { "id": 0, "name": "Sophia Mason", "availableTimes": ["9:00 am", "2:30 pm", "5:00 pm", "6:00 pm"] } // 其他该日期有可用时段的人员 ] }, // 其他日期的条目... ]
如果你的目标数组结构有特殊要求,比如需要只保留时段或者其他字段,只需要调整push里的字段或者map的返回结构就可以啦。
内容的提问来源于stack exchange,提问作者T. Evans
相关产品推荐
相关产品推荐

