前言:面试极为常见的一个问题,但不一定会单拎出来考察.有时会要求和别的功能一起实现,例如去重和排序.
1.利用索引
原理:
使用indexOf()方法,该方法返回的是索引,没有就返回-1,使用push方法()向数组尾部追加元素.
缺点:
法不能够处理数组NaN的去重,NaN不等于任何值(包括NaN)
var arr = [3, 1, 7, 9, 2, 3, 8, 9, 45, 4, 8, 3, 12, 3];
function unique(arr) {
var newarr = [];
for (var i = 0; i < arr.length; i++) {
if (newarr.indexOf(arr[i]) == -1) {
newarr.push(arr[i]);
}
}
return newarr;
}
console.log(unique(arr));
2.排序去邻
原理:
先排序,使得相同的值能够紧挨着,若相邻的值相同,则删掉后一个.
缺点:
必须要先排序.
var arr = [3, 1, 7, 9, 2, 3, 8, 9, 45, 4, 8, 3, 12, 3];
function unique (arr) {
arr.sort(function (a,b) {
return a - b;
});
for(var i = 0; i < arr.length; i++) {
var c = arr[i];
for(var j = i + 1; j < arr.length;j++) {
if(arr[j] == c) {
arr.splice(j,1);
}
}
}
return arr;
}
console.log(unique(arr));
3.对象存储
原理:
将数组元素保存到对象的属性名中,以属性值的true/false去判定是否添加到新数组中.
缺点:
比较占内存,且下面函数不够完善,没办法处理字符串与数值同时存在的情况,如:同时存在1与”1”
var arr = [3, 1, 7, 9, 2, 3, 8, 9, 45, 4, 8, 3, 12, 3,NaN];
function unique (arr) {
var o = {};
var newarr = [];
for(var i = 0;i < arr.length; i++) {
var key = arr[i];
if(!o[key]) {
//对象使用点语法或方括号语法,可以自行创建属性
//如:对象.属性名
// 保证了arr数组的值只有1次机会被添加到属性名中,
// 因为属性值没有的话为undefined,
o[key] = true;
newarr.push(key);
}
}
return newarr;
}
console.log(unique(arr));