一、IndexOf
IndexOf是数组的一个原生方法,当你传入一个参数的时候,它会返回入参数的索引值。如果未找到就返回 -1。
let arr = [1,2,3,1,2,3];
let newArr=[];
for(let i=0;i<arr.length;i++){
if(newArr.indexOf(arr[i])==-1){
newArr.push(arr[i])
}
}
console.log(newArr)
indexOf需要把每个参数重新判断一遍,效率很低下,而且indexOf还不能查到NaN
的索引值
二、排序后去重sort()
let arr = [1,2,3,1,2,3];
let newArr = Array.from(arr).sort(); //创建一个新的数组对象
let res = [newArr[0]]
for(let i=1;i<newArr.length;i++){
if(newArr[i] != newArr[i-1]){
res.push(newArr[i])
}
}
console.log(res)
- 我们先对数组进行排序,但在不影响原数组的前提下我使用了from来创建新数组
- 数组排好序之后,进行相邻比较
- res = [sortArr[0]] 和 i = 1 是个初始化操作
这样的做法,省去了对重复参数的索引。效率上面确实也提升不少。
三、利用双层循环
let arr = [1,2,3,1,2,3];
let newArr=[];
for(let i=0;i<arr.length;i++){
for(var j=0;j<newArr.length;j++){
if(arr[i] == newArr[j]){
break
}
}
if(j === newArr.length) {
newArr.push(arr[i])
}
}
console.log(newArr)
- 对初始值数组进行每一项与目标数组每一项进行比较
- 如果有重复就跳出循环
- 如果全部都不相等,那么j就会等于res.length。此时,把值添加到res中
由于是双层循环 效率也不会提高多少
四、利用ES6 new Set()
let newArr = new Set(arr);
console.log(newArr)
但不知道为什么京东笔试的时候不支持这样去重
五、利用includes
let arr = [1,2,3,1,2,3];
let newArr=[];
for(let i=0;i<arr.length;i++){
if(!newArr.includes(arr[i])){
newArr.push(arr[i])
}
}
console.log(newArr)
六、利用hasOwnProperty去重
let arr = [1,2,3,1,2,3];
let obj={}
let newArr= arr.filter((item)=>{
if(obj.hasOwnProperty(typeof item + item)){
return false
}else{
obj[typeof item + item] = true
console.log(obj)
return true
}
})
console.log(newArr) //此方法可以去重{}、NAN
typeof item + item
可以输出"item数据类型 + item值"
的字符串结果
hasOwnPrototype()
来判断obj
内是否有这个数据类型的数据,如何没有就存入obj中,如果有那么就直接返回false,根据filter()
的用法,这个数据就会被过滤掉。
七、利用filter + indexOf
跟上面的差不多 不讨论
参考链接:https://segmentfault.com/a/1190000016418021#articleHeader9
效率:Set>sort>双层循环>indexOf