前端性能优化实战:Map映射 vs 递归,差距210倍!

10000条数据,浏览器卡死3秒?这招让它0.01秒搞定!

你有没有这样的经历?

页面 loading 转圈圈,点了没反应,过了几秒浏览器弹出"页面无响应"...

罪魁祸首可能就是一个简单的树形结构转换

今天分享一个实战案例,教你从 O(n²) 优化到 O(n) ,性能提升 210倍


🔥 问题场景

后端返回扁平数据,前端要转成树形结构展示:

❌ 错误写法:递归遍历

javascript 复制代码
// 时间复杂度 O(n²) - 数据量大直接卡死
function buildTree(data, parentId = 0) {
  const result = []
  data.forEach(item => {
    if (item.parentId === parentId) {
      const node = { ...item }
      node.children = buildTree(data, item.id)  // 递归,每次都遍历全数组
      result.push(node)
    }
  })
  return result
}

问题: 找每个节点的子节点都要遍历一遍数组,10000条数据要循环 1亿次


✅ 正确写法:Map映射

javascript 复制代码
// 时间复杂度 O(n) - 只需遍历2次
function buildTree(data) {
  const map = new Map()
  const tree = []
  
  // 第1遍:建立 id → node 映射
  data.forEach(item => {
    map.set(item.id, { ...item, children: [] })
  })
  
  // 第2遍:挂到父节点下
  data.forEach(item => {
    const node = map.get(item.id)
    if (item.parentId === 0) {
      tree.push(node)  // 根节点
    } else {
      map.get(item.parentId)?.children.push(node)
    }
  })
  
  return tree
}

核心优化: 用 Map 做索引,查找从 O(n) 变成 O(1)!


📊 实测对比

常规性能测试结果:数据越大,加速比越大。

1000条数据 3000条数据

webWorker性能测试结果:在webWorker下,常规递归方法也变得很快,且解决了页面"假死"情况出现。

1000条数据 10000条数据

🚀 终极方案:Web Worker

数据量超大时,用 Web Worker 避免阻塞主线程:

javascript 复制代码
// 主线程
const worker = new Worker('./tree.worker.js')
worker.postMessage({ data: rawData })

worker.onmessage = (e) => {
  treeData.value = e.data.result
  worker.terminate()  // 用完销毁
}

效果: loading 动画流畅,页面完全不卡!


💡 一句话总结


❤️ 源码地址

gitee源码地址: https://gitee.com/benxiaohai1071/bxh-admin-vue3/blob/master/src/views/func/performance/bigDataHandle.vue

相关推荐
流光D4 分钟前
AI Era: Building Web Sites and Configuring Nginx Reverse Proxy Process
前端·人工智能·nginx
sakidd4 分钟前
VS Code 的 AI Chat 现在已经这么能干了?
前端
计算机魔术师12 分钟前
英伟达砸130亿美元买下一个平台,黄仁勋到底在怕什么?
前端
leoZ23124 分钟前
第 2 篇:搭建地基——Vue3 + Vite + Tailwind v4 + shadcn-vue
前端·javascript·vue.js·人工智能·目标检测·数据挖掘·语音识别
coderCN41 分钟前
Nodejs path OS process child_process FS crypto zlib ffmpeg Markdown 转 html
前端
梨想橙汁1 小时前
JS BOM 浏览器对象:定时器与同步异步底层理解
前端·javascript
梨想橙汁1 小时前
ES6+ 必用新特性:箭头函数、解构、模板字符串、扩展运算符
前端·javascript
梨想橙汁1 小时前
DOM 与 JS 事件:页面元素操作、事件冒泡、事件委托实战
前端·javascript
Dreams°1231 小时前
【React+TS+ECharts可视化避坑:图表空白、不实时更新、数据池堆积卡顿完整复盘(附完整源码)】
前端·react.js·echarts
计算机魔术师1 小时前
三年前估值45亿,现在129亿——Hugging Face凭什么被老黄盯上?
前端