据说现在很多笔试和面试都会考字符串去重和数组去重
其实我很弱,数据结构很弱
所以只是研究了一下,网上有很多中方法,我只是选了两个自己勉强能够理解的写写
第一个:
//数组去重2 var delsRept = function(val){ var ren=[];//返回的数组 for(var i=0,len=val.length;i<len;i++){ if(val.indexOf(val[i]) == i){//indexOf传的值是匹配的字符,返回的是该字符在数组中第一次出现的位置 ren.push(val[i]);//如果当前出现的位置是第一次,就压栈到ren里 } } return ren; } var value=["a",'a','d','d','c','a']; console.log(delsRept(value));第二个:
//字符串去重 var delRepte = function(str){ var ret="",obj={};//ret为返回的字符串,obj用于保存每个字符的对象,用于防止进入对象的数据重复 for(var i=0,len=str.length; i<len ;i++){ var s = str.substr(i,1);//截取字符串的每一个值,赋值给s obj[s] = s;//将"s":"s"类型的键值对放入obj对象里 } for(var key in obj){ ret+= obj[key]; //便利对象obj,把键值对在组合成字符串放入ret } return ret; }; var val="adasdfsdfsdfsdasd"; console.log(delRepte(val));或许性能不是最高的,但是这是自己理解了的,顺便也把网上找的其他几种方法贴上去
//第一个 var str = ''; if(!String.prototype.removal){ String.prototype.removal = function(){ if(!this) return; var obj = {}; for(var i=0; i<this.length; ++i){ obj[this.substr(i, 1)] = 1; } var str = ''; for(var name in obj){ str += name; } return str; } } console.log(str.removal());
//第二个用正则只是语句简洁,不过要快的话还是得用O(n)的算法: function nubA(s) { return s.replace(/([\x00-\x7f])(?=.*?\1)/gi, ''); } function nubB(s) { var codes = new Array(128); for (var i = 0, l = s.length; i < l; ++i) { var c = s.charCodeAt(i); codes[c] = c; } codes = codes.filter(function (v) { return v !== undefined; }); return String.fromCharCode.apply(null, codes); }
//第三种 var repeatClear = function(s){ if(s){ var m = {},n = ""; for(var i in s){ if(s[i] in m){ //Do Nothing }else{ m[s[i]] = true; n += s[i]; } } return n; }else{ return s; } }; alert( repeatClear("aagbdfcedskahkxxbhxbshb") ); // 建议只循环一次,还有string的循环可以直接用for-in的; string长度不足1的时候建议返回本身,而不是undefined。
//方法1: Array.prototype.distinct = function(){ var arr = [], len = this.length; for ( var i = 0; i < len; i++ ){ for( var j = i+1; j < len; j++ ){ if( this[i] === this[j] ){ j = ++i; } } arr.push( this[i] ); } return arr; };
//方法二 Array.prototype.distinct = function(){ var self = this, arr = self.concat().sort(); // 创建一个新数组并排序 arr.sort(function( a, b ){ if( a === b ){ var n = self.indexOf( a ); //获取索引值 self.splice( n, 1 ); } }); return self; };
//方法三 Array.prototype.delRepeat=function(){ var newArray=[]; var provisionalTable = {}; for (var i = 0, item; (item= this[i]) != null; i++) { if (!provisionalTable[item]) { newArray.push(item); provisionalTable[item] = true; } } return newArray; };
//方法四 Array.prototype.distinct = function(){ var arr = [], obj = {}, i = 0, len = this.length, result; for( ; i < len; i++ ){ result = this[i]; if( obj[result] !== result ){ arr.push( result ); obj[result] = result; } } return arr; };