如何优化forEach迭代性能,实现10K商品数组与2K订单数组的匹配输出?
优化方案
你原代码性能差的核心原因是嵌套循环带来的O(n*m)时间复杂度:遍历10k条商品的每一条时,都要完整遍历2k个订单,累计执行2000万次匹配判断,叠加每次判断都要做一次Number(order.itemId)类型转换,自然耗时极高。
优化核心逻辑是把订单数组预处理为以itemId为键的哈希映射表,把匹配逻辑从嵌套循环的O(n)查找降为O(1)的哈希表查找,整体时间复杂度降到O(n+m),性能可提升上百倍,且完全保留你需要的输出结构。
实现代码
// 第一步:预处理订单,构建哈希映射表,key为数字类型的itemId,value为对应订单列表(兼容单商品对应多订单的场景) const orderMap = new Map() // 处理本地订单 localOrders.forEach(order => { const itemId = Number(order.itemId) if (!orderMap.has(itemId)) { orderMap.set(itemId, []) } orderMap.get(itemId).push({ order, type: 'local' }) }) // 处理线上订单 onlineOrders.forEach(order => { const itemId = Number(order.itemId) if (!orderMap.has(itemId)) { orderMap.set(itemId, []) } orderMap.get(itemId).push({ order, type: 'online' }) }) // 第二步:遍历商品匹配订单 const inventory = [] allItems.forEach(item => { const matchedOrders = orderMap.get(item.id) if (matchedOrders) { matchedOrders.forEach(({order, type}) => { inventory.push({ item, order, type }) }) } }) return inventory
额外说明
- 输出结构和你原代码完全一致,满足同时返回商品详情、订单详情、订单类型的需求
- 提前一次性完成所有
order.itemId的类型转换,不需要每次匹配重复执行,进一步压缩耗时 - 如果你确认每个
itemId只会对应一个订单,可以把映射表的value改成单个对象,去掉matchedOrders的循环,性能还能再提升
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

