1.前言
每日记录一篇大厂面试题
2.题目
你对数组去重有了解吗? ES5怎么和ES6 分别阐述一下实现思路!
// 如果当前数组中有10万条数据、请问哪种方法最优?面试时大脑飞速运作,,,
3.解析
js数组去重网上有一堆的文章讲解、本篇文章是针对自己面试经验回答一下自己的心得 网上其他的有十几种 我就简单阐述几种,哈哈哈
1、ES6 new Set() 去重
ES6的语法比较简单明了
// 去重的数组
var list = [1,1,2,2,3,3];
function unique(arr) {
return Array.from(new Set(arr))
}
// 输出返回值
console.log(unique(list));// [1,2,3]
// 其实也可以直接使用以下方案
console.log([...new Set(list)])// [1,2,3]
2、ES5 indexOf 去重
判断indexOf的值是否与元素索引值相等
var list1 = [1, 1, 2, 2, 3, 3];
function unique(list) {
let arr = [];
// 数组遍历
for (var i = 0; i < list.length; i++) {
if (list.indexOf(list[i]) === i) {
arr.push(list[i])
}
}
// 返回
return arr;
}
// 输出返回值
console.log(unique(list1));// [1,2,3]
3、最优方案
上面提到处理10万条数据 最优的解决方案 利用对象来处理
function unique(list) {
// 首先处理是否传入的是数组 不是的话 直接return
if (!Array.isArray(list)) {
console.log('type error!')
return
}
var arrry = [],
obj = {},
len = list.length;
// 不管怎么有 10万条数据 for是跑不掉
for (var i = 0; i < len; i++) {
// 如果当前对象中没有该属性 那就添加到array数组中
if (!obj[list[i]]) {
arrry.push(list[i]);
// 记录当前对象属性为1 未保存则push到新数组并用object[list[i]]=1的方式记录保存
obj[list[i]] = 1
}
}
return arrry;
}