JavaScript 从对象数组按from.flightNo与to.flightNo提取重复航班对象
重复航班提取的优化实现
原实现的核心问题
- 效率低下:每次对数组元素做映射时,都要全量遍历整个数组做匹配计数,整体时间复杂度为O(n²),数组规模较大时性能损耗明显
- 数据遗漏:计数触发逻辑设计不合理,无法完整提取同一重复组的全部元素,只能命中部分重复项
- 写法冗余:依赖隐式返回undefined做后续过滤,可读性差,逻辑绕
优化思路
将from.flightNo和to.flightNo拼接为唯一复合键,先完成全量元素的频次统计,再筛选出所有属于「出现次数≥2」的复合键对应的原元素,整体时间复杂度降为O(n),逻辑清晰无数据遗漏。
具体实现代码
// 1. 统计每个航班组合的出现频次 const flightKeyCount = myArray.reduce((acc, cur) => { // 生成判断重复的唯一标识:出发航班号 + 到达航班号 const key = `${cur?.from?.flightNo || ''}_${cur?.to?.flightNo || ''}`; acc[key] = (acc[key] || 0) + 1; return acc; }, {}); // 2. 筛选出所有属于重复组的元素 const duplicates = myArray.filter(item => { const key = `${item?.from?.flightNo || ''}_${item?.to?.flightNo || ''}`; return flightKeyCount[key] >= 2; });
说明
- 运行结果和预期输出完全匹配,且严格保留原数组的元素顺序
- 代码内置了可选链和空值兜底,遇到缺失航班号属性的异常元素也不会触发报错
内容的提问来源于stack exchange,提问作者arled
相关产品推荐
相关产品推荐

