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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:03