1.双重循环遍历
function unique1(arr){
// 遍历数组arr
for(var i = 0, r = []; i < arr.length; i++){
// 遍历数组r
for(var j = 0; j < r.length; j++){
// 如果遍历到r中的元素等于arr中的当前元素退出循环
if(r[j] == arr[i]){
break;
}
}
// 如果遍历到最后没有发现有与arr当前元素相同的元素
if(j == r.length){
// 则把这个元素追加到末尾
r[r.length] = arr[i];
}
}
return r;
}
2.使用哈希数组的方式
function unique2(arr){
// 遍历数组arr
for(var i = 0, hash = [], r = []; i < arr.length; i++){
// 如果哈希数组中不存在以arr[i]为下标的变量
if(hash[arr[i]] === undefined){
// 将这个值存入最终数组中
r[r.length] = arr[i];
// 并把该值作为下表存入哈希数组,给一个自定义的值
hash[arr[i]] = 1;
}
}
return r;
}
3.对象
function unique3(arr){
// 与第二种方式的算法基本一致,因为对象的存储方式在底层就是数组
var obj = {};
// 遍历数组
for(var i = 0, r = []; i < arr.length; i++){
// 在obj中如果不存在以arr的当前值为属性名的属性
if(!obj[arr[i]]){
// 将这个值存入最终数组中
r.push(arr[i]);
// 并把该值作为下表存入哈希数组,给一个自定义的值
obj[arr[i]] = 1;
}
}
return r;
}
4.先给数组排序
function unique4(arr){
// 给arr排序
arr.sort(function(a,b){return a-b})
// 遍历数组
for(var i = 1; i < arr.length; i++){
// 如果当前值等于了前面的那个值
if(arr[i] === arr[i-1]){
// 删除这个值
arr.splice(i,1);
// 因为删除了一个值,需要让循环向前移动一次
i--;
}
}
return arr;
}
5.通过下标
function unique5(arr){
// 遍历数组
for(var i = 0; i < arr.length; i++){
// 遍历数组寻找与arr当前值相等的值
for(var j = i + 1; ; ){
// j记录找到的下标
j = arr.indexOf(arr[i], j);
// 如果j为-1了,代表后面没有相同的值了
if(j == -1){
break;
}
// 删除这个值
arr.splice(j, 1);
}
}
return arr;
}
6.
function unique6(arr){
// ES6新语法
return new Set(arr);
}
var arr = [5,4,9,1,6,8,7,5,4,2,4,5,6,4,2,6,4,2,1,5,9]