Jul 14

Flex中ArrayCollection的复制(克隆)删除 阴

windshow , 17:01 , 风语 , 评论(1) , 引用(0) , 阅读(27345) , Via 本站原创 | |

在Flex的开发过程中,常常会遇到复制ArrayCollection的情况。以前只是从网上找个方法拿来就用,也没有具体的搞清楚所以然来。今天有时间,研究了一下,总结如下:

Flex中的复制同java一样,也分为深复制和浅复制下面总结一下ArrayCollection的浅复制,共有4种方法:

1、var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

2、var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

3、var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

4、var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

以上方法中,第一种方法由于不是创建的独立的ArrayCollection对象,所以不推荐使用。第二、三、四种方法相似,可以参考使用。

有的时候,我们也会用到深复制,方法如下:

var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

this.clone()方法定义如下:

function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}

下面是我测试以上程序的Flex程序代码,大家可以参考:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()" layout="absolute">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.collections.ListCollectionView;
import mx.controls.Alert;
import flash.utils.ByteArray;


public function initApp():void
{
}


//开始测试:
//浅复制1
private function test1():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ListCollectionView=new ListCollectionView(ListCollectionView(oldArray).list);

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}
//浅复制2
private function test2():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.source);

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//浅复制3
private function test3():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.source.slice());

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//浅复制4
private function test4():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=new ArrayCollection(oldArray.toArray());

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//深复制
private function test5():void
{
//初始化需要的对象
var obj1:Object=new Object();//定义对象obj1
var obj11:Object=new Object();//定义对象obj1的引用对象obj11
obj1.name="obj1.name";
obj1.sub=obj11;//obj1的sub属性引用obj11
obj11.name="obj11.name";
//实例化ArrayCollection对象,并将obj1添加进该对象
var oldArray:ArrayCollection=new ArrayCollection();
oldArray.addItem(obj1);

//浅复制ArrayCollection
var newArray:ArrayCollection=ArrayCollection(this.clone(oldArray));

//修改obj11.name的值
obj11.name="obj11.name is changed!";

//输出复制前后的两个对象所引用的obj11对象的name属性值,如一致为浅复制,不一致为深复制
Alert.show(oldArray.getItemAt(0).sub.name+"---"+newArray.getItemAt(0).sub.name);
}

//深复制调用的方法
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
]]>
</mx:Script>
<mx:Button label="第一种浅复制方法" click="test1()" x="61" y="36"/>
<mx:Button label="第二种浅复制方法" click="test2()" y="57" x="61" width="114"/>
<mx:Button label="第三种浅复制方法" click="test3()" y="78" x="61" width="114"/>
<mx:Button label="第四种浅复制方法" click="test4()" y="98" x="61" width="114"/>

<mx:Button label="深复制方法" click="test5()" y="147" x="61"/>
</mx:Application>



删除


<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init()"

backgroundGradientColors="[#ffffff, #ffffff]" >

<mx:Script>

<![CDATA[

import mx.collections.ArrayCollection;

[Bindable]

public var ac:ArrayCollection=new ArrayCollection([

{name:"1",sex:"男",age:"11"},

{name:"2",sex:"女",age:"12"},

{name:"3",sex:"女",age:"14"},

{name:"4",sex:"女",age:"15"},

{name:"5",sex:"男",age:"16"},

{name:"6",sex:"男",age:"13"}

]);

public function init():void{

for(var i:int=0;i<ac.length;i++){

var item:Object=ac.getItemAt(i);

if(item.sex=="女"){

ac.removeItemAt(i);

}

}

}

]]>

</mx:Script>

<mx:DataGrid width="100%" dataProvider="{ac}">

<mx:columns>

<mx:DataGridColumn dataField="name" width="100" headerText="ID"/>

<mx:DataGridColumn dataField="sex" width="100" headerText="性别"/>

<mx:DataGridColumn dataField="age" width="100" headerText="年龄"/>

</mx:columns>

</mx:DataGrid>

</mx:Application>




January 1, 2011 16:06 zhen63165 Email Homepage
Schott (1)
Type
Coupe-vents(1)
Doudounes(5)
Manteaux de fourrure(1)
Blousons(1)
Matière
Fausse fourrure(1)
Fourrure(1)
Menlook(1)
Galeries Lafayette(4)
&bull;  doudounes rouge
&bull;  doudoune homme
&bull;  doudoune
&bull;  doudoune sans manche homme
&bull;  doudoune a capuche homme
&bull;  doudoune capuche fourrure homme
&bull;  doudoune duvet homme
&bull;  doudoune homme kaporal
&bull;  doudoune cuir homme
&bull;  doudoune matelassee homme
&bull;  doudoune homme diesel
&bull;  blouson doudoune homme
&bull;  veste rouge en cuir pour homme
&bull;  doudoune redskins
&bull;  doudoune plumes
&bull;  doudoune capuche
&bull;  manteaux doudoune
&bull;  doudoune cuir
&bull;  veste doudoune
&bull;  doudounes avec fourrure
&bull;  doudoune converse
&bull;  doudoune noir
&bull;  doudoune mode
&bull;  blouson doudoune
Autres Manteaux et vestes recherchés...
&bull; Comme celui-ci&bull;
De Menlook
&bull; In questo Intervallo di prezzi (circa 349 ?)&bull;
Avec Type: Doudounes&bull;
Avec Type: Blousons Voir plus de resultats...
&bull;
De Galeries Lafayette (4) Autres Manteaux et vestes recherchés...
&bull; Comme celui-ci&bull;
De Galeries Lafayette
&bull; In questo Intervallo di prezzi (circa 265 ?)&bull;
Avec Type: Doudounes Recherches Relatives:
&bull; doudoune homme&bull; doudoune&bull; doudoune sans manche
分页: 1/1 第一页 1 最后页
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]