【前端每天一题】第 16 题:数组去重高频方法(Set / filter / reduce / 对象键值法)

下面是 下一道高频前端面试题(详细版 + 速记卡片)

第 16 题:数组去重高频方法(Set / filter / reduce / 对象键值法)

这道题是前端面试中常考的基础题。


✅ 第 16 题:数组去重有哪些方法?如何实现?


📘 一、方法 1:Set(最简洁高频)

javascript 复制代码
const arr = [1,2,2,3,4,4]
const uniqueArr = [...new Set(arr)]
console.log(uniqueArr) // [1,2,3,4]

✅ 优点:

  • 简单、语义清晰
  • 支持基本类型
  • ES6 标准

⚠️ 注意:

  • 对象类型(引用类型)不同引用不会去重
ini 复制代码
const arr = [{a:1},{a:1}]
[...new Set(arr)] // [{a:1},{a:1}]

📘 二、方法 2:filter + indexOf

javascript 复制代码
const arr = [1,2,2,3,4,4]
const uniqueArr = arr.filter((item, index, self) => self.indexOf(item) === index)
console.log(uniqueArr) // [1,2,3,4]

✅ 优点:

  • ES5 可用
  • 清晰直观

⚠️ 性能较低,嵌套 indexOf 可能慢


📘 三、方法 3:reduce + includes

scss 复制代码
const arr = [1,2,2,3,4,4]
const uniqueArr = arr.reduce((acc, cur) => {
  if(!acc.includes(cur)) acc.push(cur)
  return acc
}, [])
console.log(uniqueArr) // [1,2,3,4]

✅ 优点:

  • 可链式扩展
  • ES5+ 通用

⚠️ includes 性能稍慢,大数组慎用


📘 四、方法 4:对象键值法(适合基本类型)

javascript 复制代码
const arr = [1,2,2,3,4,4]
const obj = {}
const uniqueArr = arr.filter(item => {
  if(obj[item]) return false
  obj[item] = true
  return true
})
console.log(uniqueArr) // [1,2,3,4]

✅ 优点:

  • 性能好
  • ES5 可用

⚠️ 只能处理字符串/数字等可做对象键的类型

  • 对象、数组、NaN、0/-0 可能需要注意

📘 五、速记卡片(面试背诵版)

sql 复制代码
🎯 高频方法:
1️⃣ Set: [...new Set(arr)]  → 简单,现代 JS
2️⃣ filter + indexOf → ES5 可用
3️⃣ reduce + includes → 可扩展
4️⃣ 对象键值法 → 性能好,注意对象类型

下一题推荐:
第 17 题:JS 原型式继承 / ES6 class 继承对比 + 原理

是否继续出第 17 题?

相关推荐
hedley(●'◡'●)14 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751514 小时前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育14 小时前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再14 小时前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose15 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花15 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹15 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
信码由缰15 小时前
Spring Boot 面试问题
spring boot·后端·面试
NCDS程序员16 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵16 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css