无需显式循环:基于另一嵌套数组过滤嵌套数组
嵌套数组按ID匹配日期过滤方案
这里提供一个清晰的实现思路,核心是先建立日期映射表,再对目标数组进行过滤:
// 第一步:把array1的日期按ID整理成映射表(用Set提升查找效率) const dateMap = array1.reduce((result, current) => { const validDates = new Set(current.nights.map(night => night.date)); result[current.id] = validDates; return result; }, {}); // 第二步:过滤array2,只保留匹配的日期 const filteredArray2 = array2.map(item => { const allowedDates = dateMap[item.id]; const filteredDays = item.days.filter(day => allowedDates.has(day.date)); // 返回新对象,不修改原数组数据 return { ...item, days: filteredDays }; });
步骤拆解
- 建立日期映射表:用
reduce遍历array1,把每个ID对应的所有有效日期存到Set里。用Set而不是普通数组,是因为判断某个日期是否存在时,Set.has()的速度比数组includes()快很多,数据量大的时候差异更明显。 - 过滤目标数组:用
map遍历array2的每一项,对每一项的days数组用filter筛选,只保留日期在对应ID的允许集合里的条目。用{ ...item, days: filteredDays }创建新对象,避免直接修改原数组的元素,这是JS里保持数据不可变性的常用做法,能减少意外的副作用。
验证结果
运行后得到的filteredArray2就会和你期望的结构完全一致:id为1的元素里只会保留2022-07-24和2022-07-26这两个日期的days项,id为2的元素因为所有日期都匹配,所以保留全部days。
内容的提问来源于stack exchange,提问作者Code4fun
相关产品推荐
相关产品推荐

