分享2个功能的js代码(去掉数组里重复的项、数组或对象深拷贝)

var arr = ['23','45','66','23'];
arr=arr.sort();
for(var i=0;i<arr.length;i++){
if (nary[i]==nary[i+1]){

alert("数组重复内容:"+nary[i]);

}

}

功能1:如何去掉数组里重复的项?

测试  http://blog.csdn.net/lfcss/article/details/50261337  的代码如下:

var arr = [2,1,2,10,2,3,5,5,1,10,13];   //object
var arrObj = {

    //把数组转成对象   
    toObject: function(arr) {
        var obj = {},
            j;

        for(var i = 0, j = arr.length; i<j; i++) {
            obj[arr[i]]=true;
        }
        return obj;
    },
    toArray:function(obj){
        var arr = [];
        for(var attr in obj){
            if(obj.hasOwnProperty(attr)){
                arr.push(attr);
            }
        }
        return arr;

    },
    uniq:function(arr){
        var that = this;
        return  that.toArray(that.toObject(arr));

    }
}
alert(arrObj.uniq(arr));



发现新老数组元素的数据类型发生转变,如下图所示

在源代码基础上做了改进,使数据类型沿用原来的,实现代码如下:

/*
	*适用范围:数组元素的数据类型不能为数组或对象
	*/
	var arr=[2,1,2,10,2,3,5,5,1,10,13];
	var arrobj={
		"init":function(arr){
			var that=this;
			var trantoObj=that.toArr(that.toObj(arr),arr);
			return trantoObj;
		},
		"toObj":function(arr){
			var curobj={};
			for(var i=0,j=arr.length;i<j;i++){
				if(!curobj.hasOwnProperty(arr[i])){
					curobj[arr[i]]=i;
				}
			}
			return curobj;
		},
		"toArr":function(obj,arr){
			var curarr=[];
			for(var i in obj){
				curarr.push(arr[obj[i]]);
			}
			return curarr;
		}
	}
	console.log(arr);
	console.log(arrobj.init(arr));


实现原理:原脚本把数组转换成对象时将数组值作为对象的属性名处理会被转成字符串,新脚本改成作为对象的属性值处理,保留了原数组元素的数据类型。


2、如何实现数组或对象深拷贝(数组里含对象,对象里含数组,无限级深沉拷贝)

var obj={
		"zj":{
			"hz":[{
				"xihu":["78","3","23"],
				"shangcheng":{
					"cuiyuan":"32"
				}
			},{
				"gongsu":["78","3","23"]
			}],
			"jx":"9"
		},
		"sh":"56",
		"js":{
			"sz":"34"
		}
	}
	console.log("原对象"+JSON.stringify(obj));
	var copyobj={
		"init":function(obj){
			if(obj instanceof Object){
				var resultobj=this.toCopyObj(obj);//处理对象
			}else if(obj instanceof Array){
				var resultobj=this.toCopyArray(obj);//处理数组
			}
			return resultobj;
		},
		"toCopyObj":function(obj){//对象公共函数
			var newobj={};
			for(var i in obj){
				if(obj[i].constructor == Object){//对象里有对象调用自身
					newobj[i]=this.toCopyObj(obj[i]);
				}else if(obj[i].constructor == Array){//对象里有数组调用数组公共函数
					newobj[i]=this.toCopyArray(obj[i]);
				}else{//直接赋值
					newobj[i]=obj[i];
				}
			}
			return newobj;
		},
		"toCopyArray":function(arr){//数组公共函数
			var newarr=[];
			for(var j=0;j<arr.length;j++){
				if(arr[j].constructor == Object){//数组里有对象调用对象公共函数
					newarr[j]=this.toCopyObj(arr[j]);
				}else if(arr[j].constructor == Array){//数组里有数组调用自身
					newarr[j]=this.toCopyArray(arr[j]);
				}else{//直接赋值
					newarr[j]=arr[j];
				}
			}
			return newarr;
		}
	}
	console.log("拷贝对象"+JSON.stringify(copyobj.init(obj)));

3、判断数组中是否有重复值

方法一:通过排序实现

var arr = ['12','45','34','12']
hasRepeatItem(arr);//返回true
function hasRepeatItem(arr){
	var isrepeat=false; 
	arr=arr.sort();//通过数组排序,如果有相同的两项会排在一起 
	for(var i=0;i<arr.length;i++){ 
		if (arr[i]==arr[i+1]){//通过判断如果前后两项一样,就是重复项 
			isrepeat=true; 
		} 
	} 
	return isrepeat;
}


方法二:通过对象属性实现

function isRepeat(arr){ 
	var hash = {}; 
	for(var i in arr) { 
		if(hash[arr[i]]){//相同项第二次被if判断为true 
			return true; 
		} 
		hash[arr[i]] = true;//相同项第一次被赋值 
	} 
	return false;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值