通过indexOf和lastIndexOf来判断是否唯一
是我今天看JS权威指南时候突然想到的,用indexOf和lastIndexOf来判断是否唯一,如果不唯一则将重复项删去,然后继续判断,实现如下
function unique(arr){
for(let i=0,len=arr.length;i<len;i++){
while(i!==arr.lastIndexOf(arr[i])){
// 如果不唯一,则把后面重复的一位去掉
arr.splice(arr.lastIndexOf(arr[i]),1)
len--
}
}
return arr
}
经过改进之后,将注释那行换成下面这样
arr.splice(arr.indexOf(arr[i]),1)
这样直接将前面的重复项去掉,而自动将i向前推进一位,效率高了将近1/3
第二种
这种是相当有创意的一种快速去重方法
function unique2(arr){
var newArr = []
for(let i=0,len=arr.length;i<len;i++){
for(let j=i+1;j<len;j++){
// 如果重复,则i向前推进,但不管重复项
if(arr[i]==arr[j]) j = ++i
}
// 将没有重复项的推入到新数组
newArr.push(arr[i])
}
return newArr
}
实验结果
各自去重了一百万次,未改进前,第二种是第一种的3倍,改进之后第二种是第一种的2倍,效率高得可怕,但第一种的排序是直接建立在原数组之上,第二种则重新创建了一个数组,内存占用方面还是略有差别,所以还是分情况分别适用。