js数组去重6法解析
1,建个新数组,遍历老数组,若在新数组里没找到,则将这个元素放到新数组,然后返回
Array.prototype.unique1 = function() { var n = []; for(var i = 0; i < this.length; i++) { if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; }
2,利用hash表,将放到新数组的元素在hash表中存true值,下次遍历数组时检查元素在hash表中的值
Array.prototype.unique2 = function() { var n = {},r=[]; for(var i = 0; i < this.length; i++) { if (!n[this[i]]) { n[this[i]] = true; r.push(this[i]); } } return r; }
3,遍历老数组,若是这个第i项的元素的位置不是第i项,则是重复的,忽略掉
Array.prototype.unique3 = function() { var n = [this[0]]; for(var i = 1; i < this.length; i++) { if (this.indexOf(this[i]) == i) n.push(this[i]); } return n; }
4,先将老数组排序,将老数组第一个放进新数组,老数组第二个与新数组第一个比较,若不一样则放进新数组中,若一样则是重复的,这种打乱原来的顺序了
Array.prototype.unique4 = function() { this.sort(); var re=[this[0]]; for(var i = 1; i < this.length; i++) { if( this[i] !== re[re.length-1]) { re.push(this[i]); } } return re; }
5,新建一个将原数组排过序的新数组,对新数组进行排序,对应找到重复的元素位置,在原数组里删掉它
Array.prototype.unique5 = function(){ var self = this; var _a = this.concat().sort(); _a.sort(function(a,b){ if(a == b){ var n = self.indexOf(a); self.splice(n,1); } }); return self; };
6,先把reduce方法分析下,arr.reduce(callback,[initialValue]) callback函数有4个参数,第一个参数previousValue,若是有初始值initialValue,则是初始值,若没有,则是数组中的第一个值,第二个currentValue是数组中当前被处理的元素,在新建数组中遍历老数组中的每个元素,若是没有,在新数组中加上
Array.prototype.unique6 = function() { return this.reduce(function(p, c) { if (p.indexOf(c) < 0) p.push(c); return p; }, []); };
一个10000个随机数的数组的六种测试用时:
method 1 used 349ms
method 2 used 5ms
method 3 used 442ms
method 4 used 15ms
method 5 used 13ms
method 6 used 424ms