- 第一种方法
Array.from方法可以将Set结构转为数组
let items = new Set([1, 2, 3, 4, 5]);
let array = Array.from(items);
这就是提供了一种数据去重的方法
function uniq(array) {
return Array.from(new Set(array));
}
uniq([1, 2, 3, 3]) //[1, 2, 3]
- 第二种方法
运用扩展运算符(…)提供了一种更便捷的去重方法
let arr = [2, 3, 3, 5, 6, 2];
let uniq = [...new Set(arr)];
//[2, 3, 5, 6]
- 第三种方法
这是一种原生JS的去重方法,借助一个空数组来实现去重,便于理解底层原理(xyz函数带有参数)
function xyz(arr) {
let a= [];
arr.forEach((item,index) => {
a.indexOf(item) ===-1 ? a.push(item) : ''
})
return a;
}
console.log(xyz([1,2,3,2,3]));
//[1, 2, 3]
- 第四种方法
同上(xyz函数不带参数)
拓展:需要注意的一点就是此函数可以传多个数组,但是要看arguments[index]
决定执行哪个数组,默认是执行第一个。
function xyz() {
let a= [];
Array.prototype.forEach.call(arguments[1], (item,index) => {
a.indexOf(item) ===-1 ? a.push(item) : ''
})
return a;
}
console.log(xyz([1,2,3,2,3],[2,2,1]));
//[1, 2, 3]
- 第五种方法
这是一种基于数组原型链的去重方法
Array.prototype.uniq = function() {
let a= [];
this.forEach((item,index) => {
a.indexOf(item) ===-1 ? a.push(item) : ''
})
return a;
}
console.log([1,2,1,3].uniq());
//[1, 2, 3]
比较传统的几种办法:
基本方法
主要思想:创建一个新数组,首先遍历原数组,若原数组某个元素不在新数组中,则添加到新数组;若存在,则忽略。
function uniqeArray(arr){
let res = [arr[0]];
for(let i = 0; i< arr.length; i++){
let repeat = false;
for(let j = 0; j < res.length; j++){
if(arr[i] === res[j]){
repeat = true;
break;
}
}
if(!repeat){
res.push(arr[i]);
}
}
return res;
}
先排序再去重
基本思想:先对数组排序。再定义一个新数组,遍历排序后的数组,若排序后的数组元素不等于新数组最后一个元素,则添加。
function uniqeArray(arr) {
let arr1 = arr.sort();
let res = [arr1[0]];
for(let i = 0; i< arr1.length; i++){
if(arr1[i] !== res[res.length - 1]){
res.push(arr1[i]);
}
}
return res;
}
利用对象去重
基本思想:利用对象的属性。遍历数组,若该数组元素不是对象的属性,则添加。
function uniqeArray(arr) {
let res = [];
let temp = {};
for(let i = 0; i< arr.length; i++){
if(!temp[arr[i]]){
res.push(arr[i]);
temp[arr[i]] = 1;
}
}
return res;
}
使用数组的filter,indexOf方法
基本思想:通过filter筛选出去重后的数组。若indexOf方法在该元素之后再查不到该元素的位置,表示该元素不存在,符合要求。
function uniqeArray(arr) {
return arr.filter(function (item, index, array) {
return array.indexOf(item, index+1) === -1;
})
}