如何高效简洁地去重?从下面两个角度考虑:
1.借助js对象key唯一的特性去重
2.借助Array自身方法遍历、操作Array
第一种方法最简洁,局限是使用了Array自身方法就必须承受filter不改变原数组的特点。
1 function uniq1(arr){ 2 var obj = {}; 3 return arr.filter(function(item,index,arr){ 4 if(obj.hasOwnProperty(item)){ //重复了 5 return false; 6 } else { 7 obj[item] = true; 8 return true; 9 } 10 }); 11 }
所以有了第二种方法,我们自己来对数组筛选,满足一切去重的自定义要求。这里使用splice是对原数组进行元素删除,使得可以改变原数组。删除元素引起数组下标发生变化,所以第六行把i--。这种情况不能使用forEach遍历,因为该方法中的index貌似是只读的。
1 function uniq2(arr){ 2 var obj = {}; 3 for(i=0;i<arr.length;i++){ 4 if(obj.hasOwnProperty(arr[i])){ //重复了 5 arr.splice(i,1); 6 i--; //不加这行代码会每次漏掉一个元素 7 } else { 8 obj[arr[i]] = true; 9 } 10 } 11 return arr; 12 }