438

问答题 438 /501

数组的去重,尽可能写出多个方法

参考答案

参考回答:

首先介绍最简单的双层循环方法:
var array = ['1','2',1,'1','4','9','1'];
function unique(array){
var res=[];
for(var i=0,arraylen=array.length;i<array.length;i++){
for(var j=0,reslen=array.length;j<array.length;j++){
if(array[i]==res[j])
break;
}
if(j===reslen)
{
res.push(array[i])
}
}
return res;
}
console.log(unique(array));

2、用indexOf简化内层循环:indexOf函数返回某个指定的字符在字符串中第一次出现的位置

var array = ['1','2',1,'1','4','9','1'];
function unique(array){
var res=[];
for(var i=0,len=array.length;i<len;i++){
var current=array[i];
if(res.indexOf(current)===-1)
{
res.push(current);
}
}
return res;
}
console.log(unique(array));

排序后去重

var array = ['1','2',1,'1','4','9','1'];
function unique(array) {

// res用来存储结果

var res=[];
var sortArray = array.concat().sort();
console.log(sortArray);
var seen;
for(var i=0,len=sortArray.length;i<len;i++){
if(!i||seen!==sortArray[i]){
res.push(sortArray[i]);
}
seen=sortArray[i];
}
return res;
}
console.log(unique(array)); //

ES6的方法,使用set和map数据结构,以set为例,它类似于数组,但是成员的值都是唯一的,没有重复的值,很适合这个题目

var array = ['1','2',1,'1','4','4','1'];
function unique(array) {

// res用来存储结果

return Array.from(new Set(array));
}
console.log(unique(array));

或者更简化点

var array = ['1','2',1,'1','4','4','1'];
function unique(array) {

// res用来存储结果

return [...new Set(array)];
}
console.log(unique(array));

参考资料:冴羽大大的JavaScript专题博客系列