著名面试题:
如何实现数组去重?
假设有数组 array = [1,5,2,3,4,2,3,1,3,4]
你要写一个函数 unique,使得
unique(array) 的值为 [1,5,2,3,4]
也就是把重复的值都去掉,只保留不重复的值。
- 自己写的笨方法
function unique(array){
let arr = []
array.forEach(item =>{
if(!arr.find(e => e === item)){
arr.push(item)
}
})
return arr
}
let array = [1,5,2,3,4,2,3,1,3,4]
console.log(unique(array))
经典的双循环去重:
function unique(arr) {
let res = [arr[0]]
for (let i = 1; i < arr.length; i++) {
let flag = true
for (let j = 0; j < res.length; j++) {
if (arr[i] === res[j]) {
flag = false;
break
}
}
if (flag) {
res.push(arr[i])
}
}
return res
}
缺点是时间复杂度为 O(n^2),数组长的话消耗时间和内存。
- indexOf 方法去重
function unique(arr) {
let array = []
for (let i = 0; i < arr.length; i++) {
if (array.indexOf(arr[i]) === -1) {
array.push(arr[i])
}
}
return array
}
定义空数组,用for循环遍历需要去重的数组arr,调用indexOf方法获取arr元素是否在数组array中,如果不在其中,其索引为-1,将对应的元素push到新数组中。
- set去重
function unique(arr){
return Array.from(new Set(arr))
}
let array = [1,5,2,3,4,2,3,1,3,4]
console.log(unique(array))
优点:代码量少,缺点,达不到去除数组内多个空对象的功能。
- map 方法
function unique(arr){
let unique = {};
arr.forEach( item => unique[JSON.stringify(item)]=item )
arr = Object.keys(unique).map(function(u){
return JSON.parse(u);
})
return arr;
}
}
缺点: 重复的对象{x:1,y:2}与{y:2,x:1}通过JSON.stringify后,其字符串化值不同,对这种对象无法进行去重;对 falsy 元素不能进行去重。
个人学习用