同数据类型元素去重复
var color = ['red','blue','green','pink','yellow','blue','black','red'];
function unique(arr){
var newArr = new Array();
for(var i in arr){
if(newArr.indexOf(arr[i])==-1){
newArr.push(arr[i]);
}
}
return newArr;
}
unique(color) //打印值:['red','blue','green','pink','yellow','black'];
再来看下es6提供的数组去重方法是不是代码更为简洁呢?
set数据结构,成员的值都是唯一的。
var color = [1,1,2,2,3,3,4,4,5,5];
var array = Array.from(new Set(color));
console.log(array);//打印值:[1,2,3,4,5]
此时相同类型的元素被过滤掉了代码更为简洁了,那么存放不同类型的呢?接着看下面代码
var color = [1,"1",2,"2","red","red","blue","blue"];
var array = Array.from(new Set(color));
console.log(array);//打印值:[1, "1", 2, "2", "red", "blue"]
由此发现Set里面添加值的时候,不会自动类型转换,所以1和“1”是两种不同的值。Set内部判断两个值是否不同,使用的算法为“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,精确相等运算符认为NaN不等于自身。
var color = ["1",1,NaN,NaN,undefined,undefined];
var array = Array.from(new Set(color));
console.log(array);//打印值:["1",1, NaN, undefined]
以上也验证了在Set中NaN等于自身,那么我们继续往color数组添加对象类型试试呢。
var color = ['1','1',1,1,{"name":"lucy"},{"name":"lucy"},NaN,NaN,undefined,undefined];
var array = Array.from(new Set(color));
console.log(array);//打印值:["1", 1, {"name":"lucy"}, {"name":"lucy"}, NaN, undefined]
上面代码表示两个对象不相等,所以它们被识别为两个不同的对象。由此可见,Set不能对对象去重复。
网友评论