文章分类 Classification
js数组去重
稿件来源: 阳光企业网站管理系统 撰稿作者: 太阳光 发表日期: 2014-04-23 阅读次数: 236 查看权限: 游客查看
javascript数组去重方法
今天有Q友去面试,其中一个考察点就是js数组去重问题。网上随手也可以抓到大堆方法:
Array.prototype.unique1 = function () { var r = [], n = this.length; label:for(var i = 0; i < n; i++) { for(var x = 0, y = r.length; x < y; x++) { if(r[x] == this[i]) { continue label; } } r[r.length] = this[i]; } return r; };
此方法是循环数组,把不相同的字符放入一个临时数组。判断不相同的方法就是取数组字符去临时数组里一个个核对。
Array.prototype.unique2 = function() { var res = [], hash = {}; for(var i=0, elem; (elem = this[i]) != null; i++) { if (!hash[elem]){ res.push(elem); hash[elem] = true; } } return res; };
此法与上面方法类似,只不过是建了一个临时对象来储存。
Array.prototype.unique3 = function() { var temp = {}, len = this.length,tempArr=[],i; for(i=0; i < len; i++) { if(!temp.hasOwnProperty(this[i])) { temp[this[i]] = 1; } } len = 0; for(var k in temp) { tempArr[len++] = k; } return tempArr; };
此法又跟上面方法类似,只不过是使用hasOwnProperty属性来去重。由不同的数组组成一个对象,再由对象转成数组。
Array.prototype.unique4 = function () { var temp = []; this.sort(); for(var i = 0; i < this.length; i++) { if( this[i] == this[i+1]) { continue; } temp[temp.length]=this[i]; } return temp; };
些法使用了一点小技巧,先把数组排序一下,然后紧临的两个数组依次对比判断是否重复。但是sort未必会提升效率哦。
Array.prototype.unique5 = function () { return this.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(","); };
这个使用正侧方法,说实在难懂又麻烦,因为使用了三次replace。还不如自己写个简单的正侧:
Array.prototype.unique6 = function () { return this.join(";").match(/([^;])(?=;|$)(?!.*\1)/g); };
把数组转成字符,以;号连接,然后提取出现一次的字符出来。
到此也许你会说好多方法可以实现哦,正得意!但我告诉你他们都有大大的bug。如果以上方法只去重纯数字或者纯字符串的数组没有问题。但是如果去重数字和字符串混合的就有问题了。比如["a",1,"1",2,"b","2"]。因在javascript中1=="1"是成立的。
Array.prototype.unique7 = function(){ return this.filter(function(a,b,c){ return c.indexOf(a) == b; }) };
这方法好呀,利用filter方法即简单又可解决数字比较字符串的bug!等等……仍有bug呀,比如["a",1,"1",2,"b",NaN,NaN]。注意NaN!=NaN哦,只能出最后一招了:
Array.prototype.unique8 = function(){ var p = {"boolean":{}, "number":{}, "string":{}}, obj = []; return this.filter(function (x) { var t = typeof x; return (t in p) ? !p[t][x] && (p[t][x] = 1) : obj.indexOf(x) < 0 && obj.push(x); }); };
最新ES6 set去重法(推荐):
Array.prototype.unique9 = function(){ return Array.from(new Set(this)); };
关键词: javascript,数组,去重复 编辑时间: 2018-04-10 9:57:36
0
高兴0
支持0
搞笑0
不解0
谎言0
枪稿0
震惊0
无奈0
无聊0
反对0
愤怒
0%(0)
0%(0)
- 暂无评论
文章图片 article Pictrue
网友评论