思路:
(1)先构建一个reArr数组用来存在结果
(2)再for()循环原数组 与 reArr数组(也要加个循环)中的元素进行比较。
(3)比较后如果不相等,则放入reArr数组;反之,不放入。
缺点:很明显,效率太低。
Array.prototype.unique = function(){
if(this.length < 1){return this;}
var reArr = [this[0]];
for(var i = 1;i < this.length;i++){
var myswitch = true;
for(var j = 0;j < reArr.length;j++){
if(reArr[j] === this[i]){
myswitch = false;
break;
}
}
if(myswitch){
reArr.push(this[i]);
}
}
return reArr;
};
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(arr.unique());//["aa", "dad", "1", 1, 2, 3]
思路:
(1)先将原数组进行排序,再创建reArr数组
(2)将原数组第i个元素 与 reArr数组的最后一个元素进行比较(因为已经排序,所以重复元素会在相邻位置)
优点:比上面第一种方法效率高。
缺点:因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取。
Array.prototype.unique = function(){
if(this.length < 1){return this;}
this.sort();
var reArr = [this[0]];
for(var i = 1;i < this.length;i++){
if(this[i] !== reArr[reArr.length - 1]){
reArr.push(this[i]);
}
}
return reArr;
};
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(arr.unique());//["1", 1, 2, 3, "aa", "dad"]
思路:
(1)创建一个reArr数组存放结果
(2)创建一个空对象obj
(3)再将原数组进行for循环,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到reArr数组中,同时把这个元素的内容作为对象obj的一个属性,并赋值为1。
说明:每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。
优点:效率比上面方法都高。
缺点:在去重时不能判断数据类型,eg:如果数组中有两个元素:1,“1“,(一个是数字,一个是字符串)去重时会去掉其一,但实际两者并不完全相等。
Array.prototype.unique = function(){
if(this.length < 1){return this;}
var reArr = [];
var obj = {};
for(var i = 0; i < this.length; i++){
if(!obj[this[i]]){
reArr.push(this[i]);
obj[this[i]] = 1;
}
}
return reArr;
};
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(arr.unique());// ["aa", "dad", "1", 2, 3]
Set类似于数组,其成员的值都是唯一的。
利用Array.from将Set结构转换成数组
function unique(array){
return Array.from(new Set(array));
}
var arr = ["aa","dad","aa","dad","1",1,2,3,2];
console.log(unique(arr)); //["aa", "dad", "1", 1, 2, 3]