JavaScript按分类层级排序对象数组的代码性能优化咨询
现有代码问题分析
性能问题
你关注的这段嵌套查询逻辑时间复杂度为 O(n²):每遍历1个分类title,都要完整遍历一次全量products数组做匹配过滤。当产品数量大、分类数量多的时候,性能损耗会非常明显。
除此之外还有两处无用性能损耗:
- 你定义的
priority本身就是数字类型,parseFloat转换完全是多余操作,属于无意义的重复计算 - 第一步提取
category的map操作也可以省略,不需要单独提取分类再做后续操作
逻辑问题
现有逻辑存在重复分组的bug:如果有多个产品归属同一个分类,最终输出的sorted数组里会出现多个完全相同的分类分组,不符合「按分类分组」的预期。
规范问题
- 变量名
sorted语义化不足:最终输出的是按分类优先级排序后的分组结果,并非仅排序的产品数组 - 嵌套解构+多层遍历的写法可读性较低,后续维护成本高
优化方案
优化后时间复杂度为 O(n + k log k)(n为产品总数,k为分类总数),避免了重复遍历全量数组的问题,同时修复了重复分组的bug,写法更符合规范:
const products = [ // 保留你的原有products数据即可 ]; // 第一步:单次遍历完成分类分组,同时记录每个分类的优先级 const categoryMap = new Map(); for (const product of products) { const { title: cateTitle, priority: catePriority } = product.category; if (!categoryMap.has(cateTitle)) { categoryMap.set(cateTitle, { priority: catePriority, list: [] }); } categoryMap.get(cateTitle).list.push(product); } // 第二步:按分类优先级升序排序,提取分组后的产品列表 const sortedCateGroup = Array.from(categoryMap.values()) .sort((a, b) => a.priority - b.priority) .map(item => item.list); console.log(sortedCateGroup);
优化点说明
- 仅遍历1次全量products数组就完成分组,避免了重复过滤的性能损耗
- 自动去重分类,不会出现重复分组的问题
- 省略了无用的
parseFloat转换和多余的map操作 - 逻辑拆分清晰,可读性和可维护性更高
- 变量命名更符合语义,能直观体现变量用途
内容的提问来源于stack exchange,提问作者Shared User
相关产品推荐
相关产品推荐

