前几篇文章我一直在「往上走」。从序章的 Vibe Coding 提示词工程到 Claude Code 工程掌控再到大厂级模块化系统、位运算刷题实战一路冲到 FDE 时代核心力每一篇都在拉高抽象层次每一篇都在拓展 AI 开发的能力边界。 然后我老老实实坐下来写了一道数组去重题。我才突然意识到自己一路追着「高级玩法」跑却差点忘了最底层的基本功。这道题看似简单六种解法背后藏着的是我之前所有学习的底层逻辑 —— 从暴力解法的基础到数据结构的优化再到 API 的优雅封装和我一路学过来的路一模一样。 往上走得再高也要往下扎得深。前端面试必问数组去重从原理到6种最优解面试官最爱这篇文章我们来彻底搞定前端面试超高频考点数组去重。 不管是大厂面试、中小厂笔试还是日常业务开发数组去重都是绕不开的基础题。 很多人以为一句[...new Set(arr)]就完事了但面试官真正想考察的远不止这些。一、先搞懂面试官到底在考什么数组去重这道题表面考功能实际考这些常见业务逻辑是否熟练 - 会不会手写基础工具函数能不能给出多种解法是否熟悉数组 API -能不能说出每种方法优缺点-是否理解底层数据结构-代码是否健壮、可读、可维护能写出去重 60分能讲清原理 90分能对比优劣 选择合适方案 100分二、从 0 到 1先搭好函数的架子2.1 写注释 —— 不仅仅是给程序员看的很多同学一上来就写逻辑忽略了注释。但在面试中注释体现了你的协作意识和可维护性思维。/** * func unique 数组去重 * param{Array}arr - 输入数组 * returns{Array}- 去重后的数组 * author xz * date2026-05-27 */functionunique(arr){// 实现...}2.2 参数校验 —— 永远不要相信用户的输入面试官会故意传null、undefined、字符串甚至对象进来看你有没有防御意识函数健壮性非常重要面试官特别看重这一点。functionunique(arr){// 参数校验 不是数组返回空数组 if(!Array.isArray(arr)){console.log(type error)return[];}// 正式去重逻辑...7种实战解法从基础到高效第一层双重循环——暴力美学的价值for(let i0;iarr.length;i){2for(let ji 1;jarr.length;j){3if(arr[i]arr[j]){4arr.splice(j,1)5j--6}7}优点好理解 缺点O (n²) 效率低解法 2indexOf 去重functionunique(arr){if(!Array.isArray(arr))return[];letres[];for(let i0;iarr.length;i){if(res.indexOf(arr[i])-1){res.push(arr[i]);}}returnres;}开始用 API 了解法 3排序后相邻去重jsfunctionunique(arr){if(!Array.isArray(arr))return[];letres[];letsortArr[...arr].sort();for(let i0;isortArr.length;i){if(sortArr[i]!sortArr[i -1]){res.push(sortArr[i]);}}returnres;}优点快 O (n log n)缺点破坏原数组顺序解法 4对象哈希表去重空间换时间jsfunctionunique(arr){if(!Array.isArray(arr))return[];letobj{};letres[];for(let item of arr){letkeytypeof item item;if(!obj[key]){obj[key]true;res.push(item);}}returnres;}优点O (n) 效率极高数据结构思想空间换时间解法5Map—— 完美哈希表functionuniqueByMap(arr){if(!Array.isArray(arr))return[];const mapnew Map();const res[];for(let item of arr){if(!map.has(item)){map.set(item,true);res.push(item);}}returnres;}保留顺序O(n) 时间O(n) 空间这是面试官非常认可的生产环境实现解法 6Set 去重最优雅const uniquearr[...new Set(arr)];优点代码最少、效率高、稳定缺点需要 ES6 支持现代项目无压力 表格方法复杂度优点缺点双循环O(n²)好理解效率低filterO(n²)代码简洁效率低排序相邻O(n log n)快乱序哈希O(n)极快占空间SetO(n)极快、简洁、稳定推荐1. 基础不牢AI 也救不了你AI 时代很多人觉得“我不用手写AI 会写就行。” 但真相是 你不懂基础就无法判断 AI 写得对不对、优不优、稳不稳。 你没写过双循环就不知道 O (n²) 有多慢 你没踩过哈希的坑就不知道 1 和 ‘1’ 会冲突 你不懂参数校验就不知道函数为什么会崩 你不懂复杂度就不知道什么叫 “优化” AI 是执行者你是决策者。 决策者的能力来自底层基本功。2. 向上抽象 向下扎根是同一件事我们学 Prompt、学 Agent、学模块化、学工程、学 FDE 看起来是 “往上走” 但最终会发现 高级能力的底层还是基础题里那套思维。 模块化拆分职责、清晰语义 数据结构选对工具、空间换时间 Prompt精准描述意图 数组去重从暴力到最优也是精准描述意图 往上走得再高也要往下扎得深。 没有底层上层都是空中楼阁。3. 好代码 更准确地描述 “我要什么”六种解法一路看下来你会发现 代码越少不一定越厉害 但越贴近问题本质一定越高级。双重循环说我要比较每一个 indexOf 说我要查有没有 哈希表说我要标记存在过 Set 说我要一个不重复的集合编程的终极不是写指令是描述意图。4. 面试真正要的人能讲清 “为什么”会写 Set 只是及格。 能讲出六种方法、复杂度、优缺点、适用场景 才是面试官想要的基础扎实、思路清晰、懂工程、懂取舍、可成长。一题见功底一题见思维。用我朋友的话说“Be AI Native 的路上没有高级和基础的区别。你在一道小题里看到的思维深度就是你在大项目里能走到的认知高度”点点关注呀 下篇见