|
蓝森林 http://www.lslnet.com 2006年8月25日 8:28
数组的全复制
呵呵,今天工作需要,写了一个这样的小东西,不知道以前有没有人做过了呢?
如果是数组单纯的赋值,对新数组处理的时候,同样会影响原数组,所以写了这样的一个原型
[html]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="gb2312" >
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312" />
<meta name="author" content="Smiling Dolphin" />
<meta name="robots" content="all" />
<title>Dolphin Document</title>
</head>
<body>
<script language="javascript" type="text/javascript">
Array.prototype.clone = function(){
var newArr = new Array();
for(ao in this){
if(typeof(this[ao])=="object"){
newArr[ao]=this[ao].clone();
}else{
newArr[ao] = this[ao];
}
}
return newArr;
}
var aa = [[1,2,3,[8,9],4,5],[2,3,4,5,6]];
var bb = aa.clone();
bb[0].shift();bb[1].shift();
alert(aa);
alert(bb);
</script>
</body>
</html>
[/html] |
为什么直接这样不行:[code]<script language="javascript" type="text/javascript">
Array.prototype.clone = function(){
var newArr = new Array();
for(ao in this){
newArr[ao] = this[ao];
}
return newArr;
}
var aa = [[1,2,3,[8,9],4,5],[2,3,4,5,6]];
var bb = aa.clone();
bb[0].shift();bb[1].shift();
alert(aa);
alert(bb);
</script>[/code] |
为什么这样不会改变a:[code]<script>
var a=[1,[2,3],4,5];
var b=[];
for(var i in a)
b[i]=a[i];
b.shift();
document.write(a)
</script>[/code]
而这样改变了a:[code]
<script>
var a=[1,[2,3],4,5];
var b=[];
for(var i in a)
b[i]=a[i];
b[1].shift();
document.write(a)
</script>
[/code] |
如果只是想要一个和原来数组一样的clone版的话。。。。
[html]
<script>
var a=[1,2,3]
var b=[].concat(a);
b.length = 2;
alert(a);
alert(b);
</script>
[/html] |
要是原数组的元素里有数组,改变b就会影响a了[html]
<script>
var a=[1,[2,3],5]
var b=[].concat(a);
b[1].shift();
alert(a);
alert(b);
</script>
[/html] |
to wenming:嘿嘿,对象的深层复制一直是一个比较麻烦的问题,效率的提高是一个需要注意的事情~
to asfman:对象的引用,就是指针啦~~
to asde2004:多维数组没办法~ |
var a=[1,3,4];
var b=a.join("\xfe").split("\xfe"); |

BlueMiracle的方法不错,收了!:)
的确,使用递归效率不高啊!
还有,BlueMiracle的这方法与之前子乌的那个数组元素的搜索使用的方法很相似哦。 |
|