You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数组本身重构数组?请优化机场数组分组代码

数组重构代码合理性分析与优化方案

咱们来拆解你的代码,看看哪些地方可以改进,顺便修正一些你可能没注意到的边缘问题。

原代码的不合理之处

  • 误用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:57:35