欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AS3 Array学习笔记

程序员文章站 2022-07-05 11:10:59
...

详细内容请参见AS3殿堂之路和AS3 API。
一、初始化
1、public dynamic class Array extends Object,位于*包中,无需import。
1、AS3中的Array是非类型化的稀疏数组。即不要求元素类型一致,不要求每个索引都有对应值。
2、var a:Array和var a:Array=[],trace出来的a是不同的。一个是null,一个是空白("")。
3、var a:Array=[]比var a:Array=new Array()更有效率。
二、查找
indexOf(searchElement:*, fromIndex:int = 0):int
使用全等运算符 (===) 从左到右搜索数组中的项,并返回该项的索引位置(查不到会返回-1)。
var target:String = "123";
var number_ary:Array = [102,123,134];
trace(target==number_ary[1]);//此处会执行类型转制,输出为true
trace(number_ary.indexOf(target));//-1,查找不到。
另外,lastIndexOf函数与indexOf类似,只不过是从右向左查找。
三、增删
1、push和pop是针对队尾增删,unshift和shift是针对队首增删。
2、push和unshift一次可以添加多个元素,元素间以逗号隔开,两者的函数返回值是增加元素后的数组长度。
3、pop和shift一次只能删除一个元素,函数返回值就是那个被删的元素。shift删除队首元素后,其他元素索引自动减1。
四、splice和slice
1、数组.splice(索引):删除索引位置后所有元素
2、数组.splice(索引,数目):删除索引位置后指定数目的元素
3、数组.splice(索引,数目,新元素1,新元素2,…新元素n):删除索引处指定数目元素后,插入指定新元素。
4、数组.splice(索引,0,新元素1,新元素2,…新元素n):不删除,相当于在索引位置后插入指定新元素。
5、splice的返回值是包含删除元素的数组。
6、splice改变了原数组内容,slice则不会,slice会返回一个包括起点不包括终点的新数组。
7、slice要求起点索引和终点索引作为参数,无终点索引意味着截取到数组末尾,参数全无意味着浅复制整个数组。
五、concat
1、concat返回一个拼接到末尾的新数组,不改变原有数组。参数全无意味着浅复制整个数组。
2、当参数是数组而不是普通元素时,concat会将数组分成元素后按顺序加到末尾,push则不分,直接加入。
六、join
1、function join(sep:*):String,将数组中的元素转换为字符串、在元素间插入指定的分隔符、连接这些元素然后返回结果字符串。嵌套数组总是以逗号 (,) 分隔,而不使用传递给 join() 方法的分隔符分隔。
2、sep:* (default = NaN)在返回字符串中分隔数组元素的字符或字符串。省略此参数则使用逗号作为默认分隔符。
var myArr:Array = new Array("one", "two", "three");
var myStr:String = myArr.join(" and ");
trace(myArr); // one,two,three
trace(myStr); // one and two and three
七、清空
1、array.length=0//2ms,推荐使用此方法清空
2、array=[]或array=new Array()//0ms
3、array=null;//0ms,此时array处于未初始化状态
4、array.splice(0);//15ms
5、遍历后,array.pop();//28ms
6、遍历后,array.shift();//3482ms
八、浅复制和深复制
当数组元素不是基元数据类型,部分或者全部是复杂数据类型时,需要考虑深复制。
import flash.utils.ByteArray;
var foo:Array=["str",[1,2,3],{key:"k",value:"v"}];
var fooBA:ByteArray= new ByteArray();
fooBA.writeObject(foo);
fooBA.position=0;
var bar:Array=fooBA.readObject() as Array;
九、排序
1、reverse():倒置
2、默认情况下,sort()和sortOn()按以下方式排序:
(1)排序区分大小写(Z 优先于 a)。
(2)按升序排序(a 优先于 b)。
(3)修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
(4)元素无论属于何种数据类型,都作为字符串进行排序,所以 100 在 99 之前,这是因为 "1" 的字符串值小于 "9" 的字符串值。
3、sort()和sortOn()第二个参数sortOptions可以更改默认的排序方式。可以指定以下五种方式一种或多种,彼此间用OR(|)隔开。
(1)Array.CASEINSENSITIVE值为1,表示大小写不敏感,如果是数字则从小到大。
(2)Array.DESCENDING值为2,倒序排列。
(3)Array.UNIQUESORT值为4,表示必须是唯一性排序,如果比较值结果相同则放弃排序。
(4)Array.RETURNINDEXEDARRAY值为8,返回排序后索引列表,同时保持原数组不变(默认返回排序后数组)。
(5)Array.NUMERIC值为16,强制对数值从小到大排序,否则仍按默认的把数字当字符串处理。
4、sort()第一个参数是compareFunction,默认为空。指定比较函数后,程序会自动把数组中的元素一对对传入比较函数的参数A和B。
如果返回1,A排B后面;如果返回0,不分先后;如果返回-1,A放B前面。
var a:Object={price:20,number:3};
var b:Object={price:10,number:7};
var c:Object={price:50,number:1};
var amountAry:Array=[a,b,c];
function compare(paraA:Object,paraB:Object):int
{
   var resultA:Number=paraA.price*paraA.number;
   var resultB:Number=paraB.price*paraB.number;
   if(resultA>resultB) return 1;//A放B后面,从小到大排列
   if(resultA<resultB) return -1;
   return 0;
}
amountAry.sort(compare);
trace(amountAry[0].price);//50
trace(amountAry[1].price);//20
trace(amountAry[2].price);//10
5、sortOn()第一个参数是fieldName:Object,如果传递多个fieldName参数,则第一个字段表示主排序字段,第二个字段表示下一个排序字段,依此类推。Flash根据Unicode值排序(ASCII是Unicode 的一个子集)。如果所比较的两个元素中均不包含fieldName参数中指定的字段,则认为将该字段设置为undefined,在排序后的数组中将连续放置这些元素,不必遵循任何特定顺序。
var vegetables:Array = new Array();
vegetables.push(new Vegetable("lettuce", 1.49));
vegetables.push(new Vegetable("spinach", 1.89));
vegetables.push(new Vegetable("asparagus", 3.99));
vegetables.push(new Vegetable("celery", 1.29));
vegetables.push(new Vegetable("squash", 1.44));

trace(vegetables);
// lettuce:1.49, spinach:1.89, asparagus:3.99, celery:1.29, squash:1.44

vegetables.sortOn("name");
trace(vegetables);
// asparagus:3.99, celery:1.29, lettuce:1.49, spinach:1.89, squash:1.44

vegetables.sortOn("price", Array.NUMERIC | Array.DESCENDING);
trace(vegetables);
// asparagus:3.99, spinach:1.89, lettuce:1.49, squash:1.44, celery:1.29

class Vegetable {
    public var name:String;
    public var price:Number;

    public function Vegetable(name:String, price:Number) {
        this.name = name;
        this.price = price;
    }

    public function toString():String {
        return " " + name + ":" + price;
    }
}
十、forEach、every、filter、map、some
1、五个方法有一些共同点,第一个参数是回调函数,第二个是thisObject。
(1)forEach(callback:Function,thisObject:*=null):void操作数组中每项元素。回调函数无需返回值。
(2)filter(callback:Function,thisObject:*=null):Array将符合回调函数条件的元素提出来,构成新数组返回。回调函数返回单个新数组元素。
(3)map(callback:Function,thisObject:*=null):Array根据回调函数操作原数组每个元素,并利用回调函数返回结果生成新数组。回调函数返回单个新数组元素。
(4)some(callback:Function,thisObject:*=null):Array只要有一个元素让回调函数返回true,则some返回true。
(5)every(callback:Function,thisObject:*=null):Array所有元素让回调函数返回true,every才返回true。
2、回调函数需要三个参数,即项值、项索引、Array对象。项值相当于数组中的单个元素,如果是同类型则可设置为具体类型,否则为*。项索引必须是整数值,代表单个元素索引。Array对象是当前数组,将数组传给回调函数。
var book1:Object={name:"ActionScript 3 殿堂之路",author:"Kingda"};
var book2:Object={name:"Flex 3 殿堂之路",author:"Kingda"};
var book3:Object={name:"AIR 殿堂之路",author:"Kingda"};
var book4:Object={name:"Flash 5 讲解",author:"Nobody"};
var book5:Object={name:"ActionScript 3 Pattern ",author:"future"};

var bookList:Array=[book1,book2,book3,book4,book5];
var price:Array=[100,200,300,400,500];

//every用法:如果发现有书名含有Flash 5,就表示这套书有过时书
trace("这套书没有过时书?"+bookList.every(noFlash5));
/*输出:
第四本过时了
这套书没有过时书?false
*/
function noFlash5(item:*,index:int,arr:Array):Boolean
{
 if(item.name.indexOf("Flash 5")!=-1)
 {
  trace("第"+(index+1)+"本过时了");
  return false;
 }
 return true;
}

//map的用法:新生成一个书单,将price数组中的价格加入
var newBookList:Array=bookList.map(mapNewList);
trace(newBookList[0].price);
//输出:100
function mapNewList(item:*,index:int,arr:Array):Object
{
 var newBook:Object={};
 newBook.bookname=item.name;
 newBook.author=item.author;
 newBook.price=price[index];
 return newBook;
}

//some的用法:如果发现有作者是Kingda,就标识这套书选了Kingda的书
trace("这套书有Kingda写的吗?"+newBookList.some(isKingda));
//输出:这套书有Kingda写的吗?true
function isKingda(item:*,index:int,arr:Array):Boolean
{
 if(item.author=="Kingda") return true;
 return false;
}

//filter的用法:将作者为Kingda的书挑出来,生成新的书单
var kingdaBookList:Array=newBookList.filter(isKingda);
trace(kingdaBookList[2].author);
//输出:Kingda
trace(kingdaBookList.length);
//输出:3

//forEach用法:给每个书名都加上“RIA系列”几个字,并把作者名是Kingda的,改成“黑羽”
kingdaBookList.forEach(addBookHead);
function addBookHead(item:*,index:int,arr:Array):void
{
 item.bookname="RIA系列:"+item.name;
 item.author="黑羽";
}
for each(var kingdaBook:* in kingdaBookList)
{
 trace("Book:"+kingdaBook.bookname+"Author:"+kingdaBook.author);
}
/*输出
Book:RIA系列:ActionScript 3殿堂之路 Author:黑羽
Book:RIA系列:Flex 3 殿堂之路 Author:黑羽
Book:RIA系列:AIR殿堂之路 Author:黑羽
*/