如何高效地将数组元素按条件添加到另一个数组中?
优化数组关联的可扩展方案
你当前通过双重forEach循环实现品牌与车型的关联,在数据量较小时可以正常工作,但时间复杂度为O(n*m)(n为品牌数量,m为车型数量),当数据量增长到万级甚至十万级时,性能会急剧下降。下面提供两种更节省资源的优化方向:
一、代码层面优化:用哈希表(Map)降低查找成本
将品牌数组转换为以id为键的Map,车型遍历过程中可直接通过brand_id快速定位对应品牌对象,时间复杂度降至O(n+m),大幅提升处理效率:
const brands = [ {"id":1,"name":"brand_1","img_name":""}, {"id":2,"name":"brand_2","img_name":""}, {"id":4,"name":"brand_3","img_name":""}, {"id":3,"name":"brand_4","img_name":""} ]; const models = [ {"id":1,"name":"model_2","img_name":"","brand_id":2}, {"id":2,"name":"model_1","img_name":"","brand_id":2}, {"id":3,"name":"model_2","img_name":"","brand_id":2}, {"id":4,"name":"model_2","img_name":"","brand_id":2}, {"id":5,"name":"model_2","img_name":"","brand_id":2}, {"id":6,"name":"model_2","img_name":"","brand_id":2}, {"id":7,"name":"model_2","img_name":"","brand_id":2}, {"id":8,"name":"model_2","img_name":"","brand_id":2} ]; // 将品牌数组转为Map,key为brand.id,value为预初始化models数组的品牌对象 const brandMap = new Map(brands.map(brand => [brand.id, {...brand, models: []}])); // 遍历车型,直接通过brand_id从Map中获取对应品牌并添加车型 models.forEach(model => { const brand = brandMap.get(model.brand_id); if (brand) { brand.models.push(model); } }); // 转换回数组格式(若业务需要) const resultBrands = Array.from(brandMap.values()); console.log(resultBrands);
优化点说明:
- 避免嵌套循环的重复查找,每个品牌和车型仅被遍历一次
- Map的
get操作是O(1)时间复杂度,远快于数组遍历查找 - 提前初始化
models数组,省去每次判断的额外开销
二、数据库层面优化:减少查询次数(更优方案)
当前执行两次数据库查询再在代码中关联数据,其实可以直接在数据库层面通过JOIN查询一次性获取关联后的结构化数据,从根源上减少数据传输和代码处理开销:
以SQL为例,查询语句可写为:
SELECT b.id AS brand_id, b.name AS brand_name, b.img_name AS brand_img, m.id AS model_id, m.name AS model_name, m.img_name AS model_img FROM brands b LEFT JOIN models m ON b.id = m.brand_id ORDER BY b.id
查询结果返回后,可在代码中一次性分组构建品牌-车型结构,或直接使用关联数据,无需额外数组关联操作。该方案优势:
- 减少一次数据库查询,降低网络IO和数据库连接开销
- 数据库的JOIN操作经过底层优化,性能远优于代码中的循环关联
- 避免大量数据在应用层的传输与处理
内容的提问来源于stack exchange,提问作者Max Pattern
相关产品推荐
相关产品推荐

