如何从数组本身重构数组?请优化机场数组分组代码
数组重构代码合理性分析与优化方案
咱们来拆解你的代码,看看哪些地方可以改进,顺便修正一些你可能没注意到的边缘问题。
原代码的不合理之处
- 误用
map方法:你用了Array.map()但完全没用到它的返回值。map的设计初衷是转换数组元素生成新数组,而不是用来做推入其他数组这类副作用操作。换成Array.forEach()会更合适,代码意图也更清晰。 SubPriority判断逻辑错误:你的条件val.SubPriority? val.AirportCity : undefined会把0当成假值(JS里0的布尔值是false),但你的数据里有合法的SubPriority: 0条目,这些元素会被错误地排除在分组外,违背了你“SubPriority不为null”的规则。- 分组效率低下:每次遍历都要循环
customAirports找匹配的城市,时间复杂度是O(n²),如果数组规模大,性能会很差。 - 属性赋值不够直观:用
Object.assign(v, { SubAirport: [] })虽然能工作,但直接在创建分组时初始化属性会更简洁。
优化后的代码
我们会修正边缘问题,用Map实现更高效的分组,同时让代码可读性更强:
const myArray = [ { "Id": 1891, "AirportCode": "DUB", "AirportName": "Dublin Airport", "AirportCity": "Dublin", "Priority": 1, "SubPriority": 0 }, { "Id": 1921, "AirportCode": "DXB", "AirportName": "Dubai International Airport", "AirportCity": "Dubai", "Priority": 1, "SubPriority": 0 }, { "Id": 1680, "AirportCode": "DBN", "AirportName": "Dublin Municipal Airport", "AirportCity": "Dublin", "Priority": 2, "SubPriority": 1 }, { "Id": 8973, "AirportCode": "XNB", "AirportName": "United Arab Emirates - Bus Station", "AirportCity": "Dubai", "Priority": 2, "SubPriority": 1 }, { "Id": 6062, "AirportCode": "PSK", "AirportName": "New River Valley Airport", "AirportCity": "Dublin", "Priority": 3, "SubPriority": 1 }, { "Id": 1681, "AirportCode": "DBO", "AirportName": "Dubbo Airport", "AirportCity": "Dubbo", "Priority": 99, "SubPriority": null } ]; // 用Map存储已有的城市分组,实现O(1)时间复杂度的查找 const cityGroups = new Map(); const customAirports = []; myArray.forEach(val => { // 只对SubPriority不为null的元素进行分组 if (val.SubPriority !== null) { const city = val.AirportCity; if (cityGroups.has(city)) { // 将当前元素加入已有分组的SubAirport数组 cityGroups.get(city).SubAirport.push(val); } else { // 创建新分组并初始化SubAirport数组 const group = { ...val, SubAirport: [] }; customAirports.push(group); cityGroups.set(city, group); } } else { // SubPriority为null的元素直接加入结果数组,不参与分组 customAirports.push(val); } }); myArray = customAirports;
优化细节说明
- 修正
SubPriority判断:我们明确检查val.SubPriority !== null,这样0会被视为有效值(符合你的数据逻辑)。 - 高效分组:
Map提供O(1)的查找效率,整体时间复杂度降到O(n),处理大规模数组时性能提升明显。 - 代码意图更清晰:用
forEach明确表示我们是在做遍历副作用操作,而非转换数组。创建分组时直接初始化SubAirport,避免了繁琐的Object.assign调用。 - 避免副作用:我们通过扩展运算符
{ ...val, SubAirport: [] }创建新对象,而不是修改原数组元素,防止原数组在其他地方被使用时出现意外问题。
内容的提问来源于stack exchange,提问作者Rajesh Malakar
相关产品推荐
相关产品推荐

