字符串去重和数组去重

据说现在很多笔试和面试都会考字符串去重和数组去重

其实我很弱,数据结构很弱

所以只是研究了一下,网上有很多中方法,我只是选了两个自己勉强能够理解的写写

第一个:

//数组去重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;
};

你可能感兴趣的:(字符串去重和数组去重)