news 2026/6/7 1:50:16

数组扩容缩容太头疼?前端老油条教你3行代码搞定!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数组扩容缩容太头疼?前端老油条教你3行代码搞定!


数组扩容缩容太头疼?前端老油条教你3行代码搞定!

  • 数组扩容缩容太头疼?前端老油条教你3行代码搞定!
    • length 是个“双面间谍”——用好了秒变瑞士军刀,用劈了直接原地火化
    • 扩容 3 行代码模板——背下来能吹半年
    • 缩容也别 splice 到手软——“截断”性能快 10 倍
    • 扩展运算符 + filter 动态缩容——“垃圾回收”一行流
    • 真·干货:4 个实战场景,复制就能跑
      • 1. 分页预加载缓冲池——“下一页数据提前躺好”
      • 2. 拖拽排序临时扩容——“拖出边界也不报错”
      • 3. Canvas 粒子固定长度数组——“帧率稳如老狗”
      • 4. 动态表格行数随输入框变化——“用户敲几行就几行”
    • 常见翻车现场 Top 5——群里每天都有人跳坑
    • 性能彩蛋:length 截断 vs splice vs slice 实测
    • 内存爆了?检查这 3 行代码先
    • 最后的碎碎念——“别把 length 当祖宗,但也别拿它当孙子”

数组扩容缩容太头疼?前端老油条教你3行代码搞定!

微信群语音第 1 条
“兄弟们,昨天我又被数组 length 坑到 2 点,产品经理还催我‘不就是加个空行吗?咋整了一晚上?’我当场想把我 38 码的拖鞋甩他脸上。今天酒醒了,把压箱底的骚操作一次性抖出来,谁再手写 for 循环扩数组,谁就请全群奶茶!”


length 是个“双面间谍”——用好了秒变瑞士军刀,用劈了直接原地火化

先给新人递根烟:JS 里的数组本质就是披着数组皮的对象,下标不过是字符串 key,length 只是另一个可写的数字属性。
但你真敢arr.length = 0?数据说没就没,连声招呼都不打,比前女友删微信还绝情。

// 场景:后端只返回 3 条数据,前端表格默认 10 行,剩下的得补空位constbackendData=[{name:'摸鱼1'},{name:'摸鱼2'},{name:'摸鱼3'}]constROWS=10// 1. 最暴力:直接拉长backendData.length=ROWS// 后 7 项瞬间变 undefined// 注意:map 会跳过空位,所以别直接 map,否则空位还是空位// 2. 补成真的“空对象”而不是 undefinedconstfilled=Array.from({length:ROWS},(_,i)=>backendData[i]||{name:''})console.table(filled)// 10 行整整齐齐,undefined 被扫地出门

语音转文字补充:
“看到没?Array.from第二参数就是 map,一口气把空位填成你想要的形状,比new Array(10).fill({})那种全指向同一个引用的坑货强 100 倍。”


扩容 3 行代码模板——背下来能吹半年

/** * 通用扩容:保证数组长度 ≥ target,不足就补 defaultValue * @param {Array} arr 原数组(会被**原地修改**) * @param {Number} targetLen 目标长度 * @param {Any} defaultValue 填充值(支持函数,动态返回新对象) */functionexpand(arr,targetLen,defaultValue){if(arr.length>=targetLen)returnarrconstfillValue=typeofdefaultValue==='function'?defaultValue:()=>defaultValue arr.length=targetLen// ① 先拉长for(leti=0;i<targetLen;i++)arr[i]||=fillValue()// ② 空位补齐returnarr}// 使用:表格行数随用户输入动态变化lettableData=[{id:1,name:'张三'}]constexpandTo=n=>expand(tableData,n,()=>({id:Date.now(),name:''}))// 用户键盘啪啪啪expandTo(5)console.log(tableData)// 长度 5,后 4 条是全新空对象

群里有人喊:“能不能不改原数组?我 React setState 不敢乱碰。”
行,浅拷贝安排:

constsafeExpand=(arr,len,def)=>expand([...arr],len,def)

缩容也别 splice 到手软——“截断”性能快 10 倍

// 需求:只保留前 50 条聊天记录,防止页面卡成 PPTconstmsgList=[...Array(1e4)].map((_,i)=>`msg${i}`)console.time('slice')constsliceWay=msgList.slice(0,50)console.timeEnd('slice')// ≈ 0.2msconsole.time('length')msgList.length=50// 直接砍断console.timeEnd('length')// ≈ 0.02ms,十倍快乐

注意:

  1. length截断原地修改,其他引用全跟着变,React 状态请配合浅拷贝。
  2. splice会挪动索引,O(n) 复杂度,大数据量直接劝退。

扩展运算符 + filter 动态缩容——“垃圾回收”一行流

// 场景:Canvas 粒子系统,把“已死亡”粒子摘掉particles=particles.filter(p=>p.life>0)

看起来人畜无害,但粒子上万条时,每次filter都新生成一个数组,GC 压力拉满。
老油条做法:复用原数组,手动倒序删除,避免索引错位:

for(leti=particles.length-1;i>=0;i--){if(particles[i].life<=0)particles.splice(i,1)}

群里有人吐槽:“splice 不是慢吗?”
答:“索引靠近尾部、数据量 10w 以内,真香。filter 创建新数组的内存抖动反而更坑。”


真·干货:4 个实战场景,复制就能跑

1. 分页预加载缓冲池——“下一页数据提前躺好”

// 缓冲池大小 = 当前页 * 2,保证用户翻页不白屏constBUFFER_SIZE=pageSize*2letpool=[]asyncfunctionfetchAndBuffer(page){constdata=awaitapi.get(`/list?page=${page}`)pool.push(...data)// 只保留最近 2 页数据,防止爆内存if(pool.length>BUFFER_SIZE)pool=pool.slice(-BUFFER_SIZE)}

2. 拖拽排序临时扩容——“拖出边界也不报错”

// 列表 10 项,用户拖到第 12 格constsrcIdx=8constdestIdx=12expand(list,destIdx+1,()=>null)// 先补齐空位// 再交换const[item]=list.splice(srcIdx,1)list.splice(destIdx,0,item)// 最后把尾部 null 清掉list=list.filter(Boolean)

3. Canvas 粒子固定长度数组——“帧率稳如老狗”

// 初始化就申请 5000 个坑位,永不动态扩容constMAX_PARTICLES=5000constpool=Array.from({length:MAX_PARTICLES},()=>newParticle())letactiveCount=0// 需要新粒子?直接从池子拿,不用 newfunctiongetParticle(){if(activeCount>=MAX_PARTICLES)returnnullreturnpool[activeCount++]}// 粒子死亡不 splice,只做标记,下一帧统一 resetfunctionreset(){activeCount=0// 只需把 life 归零,内存零抖动}

4. 动态表格行数随输入框变化——“用户敲几行就几行”

function Table({ rowCount }) { const [data, setData] = useState([]) useEffect(() => { setData(prev => { // 浅拷贝 + 扩容/缩容一步到位 const copy = [...prev] copy.length = rowCount for (let i = 0; i < rowCount; i++) copy[i] ||= { name: '', age: '' } return copy }) }, [rowCount]) return <tbody> {data.map((row, i) => ( <tr key={i}> <td><input value={row.name} onChange={e => { const newData = [...data] newData[i].name = e.target.value setData(newData) }} /></td> </tr> ))} </tbody> }

常见翻车现场 Top 5——群里每天都有人跳坑

翻车现场原因老油条急救
const arr = []; arr.length = 10后 map 不起作用空位被 map 跳过Array.from带第二个参数
React 状态直接arr.length = n页面不更新引用没变浅拷贝[...arr]再改 length
扩展运算符[...bigArr]复制 100w 项直接卡死内存翻倍用索引复用,避免全量复制
浏览器控制台打印看不出差异引用未断开console.log(JSON.parse(JSON.stringify(arr)))强转快照
反复filter做缩容,GC 抖动掉帧频繁创建新数组倒序splice复用原数组

性能彩蛋:length 截断 vs splice vs slice 实测

constn=100000consta=[...Array(n)].map((_,i)=>i)console.time('length')a.length=50console.timeEnd('length')// 0.018msconsole.time('splice')constb=[...Array(n)].map((_,i)=>i)b.splice(50)console.timeEnd('splice')// 1.7msconsole.time('slice')constc=[...Array(n)].map((_,i)=>i)constd=c.slice(0,50)console.timeEnd('slice')// 0.2ms

结论:

  1. 单纯截断,length一骑绝尘。
  2. slice生成新数组,耗时是length的 10 倍,但胜在不污染原数组
  3. splice挪动索引,大数据量直接拉胯,除非必须保持引用一致性。

内存爆了?检查这 3 行代码先

// 错误示范:每帧都 new 数组functionanimate(){particles=particles.filter(p=>p.life>0)// 新数组 + 旧数组,内存翻倍requestAnimationFrame(animate)}// 正确姿势:对象池复用for(leti=particles.length-1;i>=0;i--){if(particles[i].life<=0)particles.splice(i,1)}

最后的碎碎念——“别把 length 当祖宗,但也别拿它当孙子”

  1. 写业务:优先可读性,Array.from+filter一把梭,早点下班陪女朋友。
  2. 写底层:粒子、音频、游戏循环,提前申请固定长度,别让 GC 出来刷存在感。
  3. React/Vue:永远记住不可变数据,改 length 前先做浅拷贝,否则调试时连console.log都背叛你。
  4. 浏览器不是无底洞,100w 条数据随便...展开,内存说炸就炸,真炸了一次你就长记性了。

语音最后一条:
“兄弟们,我把拖鞋放下了,代码也甩完了。下回再听到谁‘for 循环 push 100 个 undefined’,直接把我这篇甩他脸上,让他请全群奶茶。散!”

欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!


专栏系列(点击解锁)学习路线(点击解锁)知识定位
《微信小程序相关博客》持续更新中~结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等
《AIGC相关博客》持续更新中~AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结
《HTML网站开发相关》《前端基础入门三大核心之html相关博客》前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识
《前端基础入门三大核心之JS相关博客》前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。
通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心
《前端基础入门三大核心之CSS相关博客》介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页
《canvas绘图相关博客》Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化
《Vue实战相关博客》持续更新中~详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅
《python相关博客》持续更新中~Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具
《sql数据库相关博客》持续更新中~SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能
《算法系列相关博客》持续更新中~算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维
《IT信息技术相关博客》持续更新中~作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识
《信息化人员基础技能知识相关博客》无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方
《信息化技能面试宝典相关博客》涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面
《前端开发习惯与小技巧相关博客》持续更新中~罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等
《photoshop相关博客》持续更新中~基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结
日常开发&办公&生产【实用工具】分享相关博客》持续更新中~分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 11:41:40

YOLO12人体关键点检测零基础教程:云端GPU免配置,1小时1块上手

YOLO12人体关键点检测零基础教程&#xff1a;云端GPU免配置&#xff0c;1小时1块上手 1. 为什么你需要这个教程&#xff1f; 作为一名计算机专业的学生&#xff0c;当你接到"人体姿态估计"这样的大作业时&#xff0c;内心可能是崩溃的。特别是当你的笔记本没有GPU&…

作者头像 李华
网站建设 2026/5/30 21:24:19

是否支持视频打码?AI人脸卫士扩展功能开发指南

是否支持视频打码&#xff1f;AI人脸卫士扩展功能开发指南 1. 背景与需求分析 随着社交媒体和数字影像的普及&#xff0c;个人隐私保护成为公众关注的核心议题。尤其是在多人合照、公共监控或用户上传内容&#xff08;UGC&#xff09;场景中&#xff0c;未经处理的人脸信息极…

作者头像 李华
网站建设 2026/6/6 9:20:03

YOLO+OpenPose联合部署教程:云端1小时搞定,比本地快5倍

YOLOOpenPose联合部署教程&#xff1a;云端1小时搞定&#xff0c;比本地快5倍 1. 为什么需要YOLOOpenPose联合部署&#xff1f; 作为一名研究生&#xff0c;当你进行行为识别实验时&#xff0c;可能会遇到这样的困境&#xff1a;先用YOLO检测人体位置&#xff0c;再把结果传给…

作者头像 李华
网站建设 2026/5/28 17:32:42

手把手教你用HY-MT1.5-1.8B搭建实时翻译API

手把手教你用HY-MT1.5-1.8B搭建实时翻译API 1. 业务场景与痛点分析 随着全球化交流的不断深入&#xff0c;多语言内容处理已成为企业出海、跨境电商、智能客服等场景中的核心需求。然而&#xff0c;依赖第三方商业翻译API存在数据隐私泄露、调用成本高、网络延迟大等问题&…

作者头像 李华
网站建设 2026/6/5 11:33:16

用户脚本工具箱:5个步骤彻底改造你的网页浏览体验

用户脚本工具箱&#xff1a;5个步骤彻底改造你的网页浏览体验 【免费下载链接】greasyfork An online repository of user scripts. 项目地址: https://gitcode.com/gh_mirrors/gr/greasyfork 还在为网页上那些烦人的广告和多余的功能而困扰吗&#xff1f;想要让每个网站…

作者头像 李华
网站建设 2026/6/5 14:31:15

三极管放大区应用中的失真问题及优化策略:实战经验总结

三极管放大区应用中的失真问题及优化策略&#xff1a;实战经验总结在模拟电路设计中&#xff0c;三极管是最基础、也最容易“翻车”的有源器件之一。即便你把教科书上的公式倒背如流&#xff0c;画出的共射放大电路依然可能输出一堆“削了顶”的正弦波——不是饱和就是截止&…

作者头像 李华