蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 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的这方法与之前子乌的那个数组元素的搜索使用的方法很相似哦。




Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com