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;
}