三种要去重的数组类型
var obj1 = {
ky: 0
};
var obj2 = {};
var obj3 = {};
//arr1:全引用型
var arr1 = [obj1, obj2, obj3, obj2, obj1, obj1, obj2, obj3, obj2, obj1];
//arr2:普通型
var arr2 = [1, 2, 3, 2, 1, 1, 2];
//arr3,引用型但json后可以区分
var arr2 = [obj1, obj2, obj2, obj1, obj1, obj2, obj2, obj1];
1.暴力法:
双重循环+splice(index,1)
- 优点:适用于数组里面的任何情况;
- 缺点:效率低。
function distinct(arr) {
var newArr=arr.slice(0);
for (var index = 0; index < newArr.length; index++) {
var item = newArr[index];
for (var i = index + 1; i < newArr.length; i++) {
if (item == newArr[i]) {
newArr.splice(i, 1);
i--;
}
}
}
return newArr;
}
2.排序法:先排序,再去重
reduce()/滑动窗口
- 优点:效率高;
- 缺点:对于引用值对象无法排序,进而无法出重(arr1,arr3要修改isSame)
function distinct(arr) {
return arr.sort().reduce((init, current) => {
if (init.length === 0 || isSame(init[init.length - 1], current)) {
init.push(current);
}
return init;
}, []);
//可以自定义相同标准
function isSame(a, b) {
if (a !== b) {
return true;
}
}
}
3.set迭代器:运用set迭代器排序
- 优点:简单,快捷,全支持;
- 缺点:部分浏览器不支持es6迭代器
var newArr = [...new Set(arr)];