在我们平时开发过程中,对数组去重是经常遇到的事,下面就去重复方法给大家介绍常用的几种方式
第一种方式:嵌套循环(这个方法兼容性是最好的,但是性能比较差,需要进行两次循环)
var arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 2, 1, 5]; function unique(arr) { //定一个空数组(也是去重后返回的结果数组) var result = []; for (var i = 0, len = arr.length; i < len; i++) { var tempArr=arr[i]; for (var j = 0, len1 = result.length; j < len1; j++) { var tempResult=result[j]; // 如果在结果数组循环中找到了该元素,则跳出循环,进入下一个源数组元素的判断 if(tempArr===tempResult){ break; } } // 如果把结果数组循环完都没有找到该元素,就将该元素添加到数组中 if(j===result.length){ result.push(tempArr) } } return result } console.log(unique(arr))
第二种方式:利用数组的 indexOf 属性(IE8以及更早的版本不支持该方法)
var arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 2, 1, 5]; function unique(arr) { //定一个空数组(也是去重后返回的结果数组) var result=[]; for(var i=0,len=arr.length;i<len;i++){ if(result.indexOf(arr[i])<0){ result.push(arr[i]) } } return result } console.log(unique(arr))
第三种方式:利用js对象键值对(兼容性较好);但是这个方法的缺点是(在js对象中数字1和字符串'1'是相同,这种方法不适合字符串和数字混合的去重)
var arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 2, 1, 5]; function unique(arr) { //定一个空数组(也是去重后返回的结果数组) var result=[]; //定义一个空对象 var obj={}; for(var i=0,len=arr.length;i<len;i++){ // 如果键对应的值,为真,意味着对象的键中已经有重复的键了, // 相反如果对象中没有这个键,则将这个元素放入结果数组中去。 if(!obj[arr[i]]){ obj[arr[i]]=true; result.push(arr[i]) } } return result } console.log(unique(arr))
第四种方式:利用filter和indexOf
var arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 2, 1, 5]; function unique(arr) { return result=arr.filter((item,index,array)=>{ // 只返回那些索引等于当前元素索引的值 return arr.indexOf(item)===index }) } console.log(unique(arr))
第五种方式:利用ES6新的数据结构Set(Set里面的成员的值都是唯一的,没有重复的值)
var arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 2, 1, 5]; function unique(arr) { //Array.from方法可以将Set结构转为数组 return Array.from(new Set(arr)); //不使用Array.from;也可以使用下面的方式 // return [...new Set(arr)] } console.log(unique(arr))
第六种方式:利用ES6新的数据结构Map(通过 has 和 set 方法就能对数组进行去重)
var arr = [1, 2, 3, 4, 5, 6, 2, 1, 3, 4, 2, 1, 5]; function unique(arr) { var m=new Map(); return result=arr.filter(val=>{ //判断Map里面是否存在;如果不存在,将当前值set到map中去,并返回 return !m.has(val) && m.set(val,true) }) } console.log(unique(arr))
总结:以上就是我总结的对数组进行去重的方法,希望能够帮助到大家