1、ES6 : set
注set的坑:
类数组转为数组,ES6提供了Array.from的方式,但在ES5中,类数组可以通过[].sclice.call(likeArr)转换,但对set无效
如:var a = new Set([1,1,2,3]); [].slice.call(a) --> [];//得到空数组
将set转为数组的方式可以为:Array.from(set) ; 也可以为:var arr = [...set];//同样是es6的,解构方式。。。。
var arr = [1,2,3,3,2,3]; //第一个方案:Set //Array.from:将类数组对象转为数组 var arr1 = Array.from(new Set(arr)); console.log("方法二:"+arr1);// [1,2,3]
2、for循环,创建新数组
var unique = function(arr){ if(Object.prototype.toString.call(arr)=='[object Array]'){//类型判断 var newArr = []; for(let i=0,len=arr.length;i<len;i++){ if(newArr.indexOf(arr[i]) < 0){//不存在 newArr.push(arr[i]); } } return newArr; }else{ return arr; } }
3、使用对象的键值属性
function unique2(arr) { if (Object.prototype.toString.call(arr) !== '[object Array]') return arr; var obj = {}; var newArr = [],type,val; for(var i=0,len=arr.length;i<len;i++){ val = arr[i],type = typeof val; if(!obj[val]){//对象中没相应的键值,添加键值,同时赋值类型 obj[val] = [type]; newArr.push(val); }else if(obj[val].indexOf(type)<0){// //对象中有键值,但键值中的值对应type和数组元素type不一致, //此时判断键值的对应值,原因为: //a[1] 和a["1"]取出来是一样的,所以需要区分1和”1“ obj[val].push(type); newArr.push(val); } } return newArr; } var arr = [1,2,3,3,2,3,4,5,3]; var arr1 = ["1",1,2,"2",3,2]; console.log("第三种方式1:"+unique2(arr));//得到[1,2,3,4,5] console.log("第三种方式2:"+unique2(arr1));//得到["1", 1, 2, "2", 3]
4、判断数组下标
//判断数组下标 var unique3 = function(arr){ if (Object.prototype.toString.call(arr) !== '[object Array]') return arr; var newArr = []; for(var i=0,len=arr.length;i<len;i++){ //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if(arr.indexOf(arr[i])==i){ newArr.push(arr[i]); } } return newArr; }
5、排序后,给新数组逐个添加,并在添加前判断,新数组中的最后一个是否相等,注意此处一定为全等
// 将相同的值相邻,然后遍历去除重复值 function unique4(array){ array.sort(); //排序后,相同的值就会排在一起 var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1]){ //每次添加比较新数组的最后一个 re.push(array[i]); } } return re; }