【友情提示】
本文章花费了本人很多的精力编写调试,所以篇幅很长,但是里面的知识点很重要,而且和AS3基本上完全一样,建议大家耐心品读。对于文章中的实例要好好的研究,体会字里行间蕴含的知识点。 一、什么是数组: 如果我们将内存比喻成无数个房间(用来存放数据的),而且每个房间中只能住一个数据。 现在,假设某一个房间中住着5,后来有一个8要强行住进这个房间,于是一脚将5踢了出去。 不过可能会出现下面的情况,就是8住进来后,不把5踢出去,两个人合租,事实上这也是允许的。这种情况就被称为数组。 在房间中的各个成员在flash内被称为元素。这一些元素的数据类型不一定是相同的。也就是说在现在开放的年代,男女合租是允许的。比如在房间中又来了一个a要入住,它是字符串类型的,与前面的5和8这两个数字类型的就不相同。 房间中每个元素都有一个编号,我们在引用这些元素时,只需用编号就行。比如说将电视频道调好之后,直接用遥控器按数字即可观看相应的频道。 需要注意的是,数组中的元素编号是从0开始的。比如上面我们建的数组: 第一个元素是数字类型的5,它的编号是0号 第二个元素是数字类型的8,它的编号是1号 第三个元素是字符串类型的a,它的编号是2号。 这个编号在flash中,被称之为索引 二、创建数组的四种手段: 1、创建一个空数组,长度为 0。 var 数组名:Array=new Array(); 2、创建一个长度为n的数组,其中元素未定义。(注意,n必须数字类型的) var 数组名:Array = new Array(n); 3、创建一个长度为n的数组,其中元素值已经列出。 var 数组名:Array = new Array(元素1,元素2,……元素n); 4、创建一个长度为n的数组,其中元素值已经列出。 var 数组名:Array = [元素值,元素值 2,…元素值 n]; 按照上面介绍的四种手段,本节课开始的时候说的数组,在flash内应该如下来写: var myarray:Array=new Array(5,8,"a"); 或: var myarray:Array=[5,8,"a"]; 三、如何引用数组中的元素: 创建数组后,就可以引用其元素了,格式为: 数组名称[元素索引]; 比如说要引用上述数组第一个元素的值就可以这样写 myarray[0] 给出完整代码如下: var myarray:Array=new Array(5,8,"a"); var b=myarray[0]; trace(b); //输出5 再次强调一下,数组内,第一个元素的索引(编号)是0,而不是1。因此,如果某个数组内共有n个元素,那么,最后一个元素的索引应该等于n-1 数组是对象,既然是对象,那么就有它自已的属性和方法,下面我们就来认识一下:
最近访问本帖者列表: | |||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||
四、数组的属性
数组的属性仅有一个,就是length,用来返回数对象内含有的元素的个数(flash内称之为数组对象的长度)。 比如说上面的数组,myarray内部一共有三个元素5、8、"a"。那么这个数组的length属性值为3 给出完整代码供大家测试 var myarray:Array=new Array(5,8,"a"); b = myarray.length; trace(b); //输出结果为3 五、小插曲-----For....in循环: 在上一节课介绍循环语句时,提过for....in循环留到这一课来介绍。这个循环是用来遍历一个集合内所有对象的。比如遍历数组元素,就是说一个一个地方问每一个元素。数组中有几个元素它就循环几次。 给出代码如下: var myarray:Array=new Array(5,8,"a"); for (var i in myarray){ b = myarray; trace(b); } //输出结果为a,8,5 用for循环和length属性也可以实现遍历数组: var myarray:Array=new Array(5,8,"a") for(var i=0;i<myarray.length;i++){ b = myarray; trace(b); } //输出结果为5,8,a (我为了节省空间写在一行上,实际上应该分成三行,且没有逗号隔开。) 可以看出,这两个循环都是将数组中的循环访问了一遍。只是结果的顺序不同。 特别说明: 1、For....in循环一般不用于遍历数组(因为数组可以通过For循环直接遍历),For....in循环多用于遍历Object对象 (因为Object对象没有索引,只能用For....in循环才能调用里面的数据) 2、例2中应用了数组的length属性,这个属性最常用的就是用在for循环中,在以后的课程中会经常用到。 | |
六、数组的方法:(共介绍10个,没耐心看的话,可以分开看,一次看一个或两个)
1、concat(参数1,参数2,参数3...参数n) 将参数(就是括号内部的)中指定的参数值与原数组中的元素连接,并创建新的数组。如果参数指定的是数组,则是连接该数组的元素而不是数组本身。 直接给出例子进行分析: var myarray:Array=new Array(5,8,"a"); var myarray1 = myarray.concat("b");//将b连接到myarray数组中并创建新数组myarray1 trace(myarray); //输出5,8,a 看来concat不会改变原数组的内容 trace(myarray1); //输出5,8,a,b (myarray1的元素共有四个:5,8,a,b) for(var i in myarray1){ //由于共有4个元素,因此i=3。该循环进行4次(第4次循环时i的值变成0) c = myarray1; //第一次循环i=3 然后每循环一次i的值减1,也就是说i会分别变为2,1,0 trace(c); //第一次循环输出myarray1[3]即b 第二次就是myarray1[2]即a } 第二个例子来了: var myarray:Array=new Array(5,8,"a"); var myarray1:Array=[21,3,"as"]; var myarray2 = myarray.concat(myarray1); //这是用concat()方法将两个数组连接起来了 trace(myarray2);//输出5,8,a,21,3,as trace(myarray2.length);/*输出6 也就是说myarray2这个数组内共有六个元素(concat没有将myarray1当做一个对象加入到myarray后面, 而是将myarray1内的三个元素分别逐一加入到myarray后面)*/ for(var i in myarray2){ //myarray2中共有6个元素,所以i=5 且该循环要进行6次(第6次循环时i的值变成0) c = myarray2; //第一次循环i=5,那么c的值myarray2[5]就是as。第二次循环i=4,c为3 trace(c); //输出as,3,21,a,8,5(我为了节省空间写在一行上,实际上应该分成七行,且没有逗号隔开。) } 特别说明: (1)例1告诉我们concat不会改变原数组的内容,而是生成一个新的数组。其返回值就是这个新生成的数组 (2)例2告诉我们,如果concat内的参数指定的是数组,则是在原数组的基础上连接参数内数组的每一个元素,而不是直接将参数数组连接到原数组上。(囧,这句话写完后我自己都觉得拗口,但是本人表达能力有限,大家对照着上面的例子来理解吧) 2、join(参数) 在数组的各个元素间插入括号中指定的参数(一般称之为分隔符),用这个分隔符来连接数组的每一个元素,最后返回结果为字符串。 如果括号中没有指定分隔符,那么分隔符将用逗号。 例1: var myarray:Array=new Array(5,8,"a"); c = myarray.join("-"); trace(c); //输出为:5-8-a 注意,c的类型是字符串 例2: var myarray:Array=new Array(5,8,"a"); c = myarray.join(); d = myarray.join(""); trace(c); //输出为:5,8,a 注意:在括号中不设分隔符则将用逗号作分隔符 trace(d); //输出为:58a 啊哈,竟然没有任何的分隔符了,是不是很奇妙捏? 3、shift() 删除数组中第一个元素,并返回该元素。(该方法没有参数) var myarray:Array=new Array(5,8,"a"); var c = myarray.shift(); //注意,shift方法的返回值不是数组,而是被删除的元素 trace("被删的是:" + c); trace("被删后的数组:" + myarray); //注意,shift方法会影响原数组,本来myarray内有三个元素的,经过shift后,只有两个元素了 /* 输出结果是: 被删的是:5 被删后的数组:8,a */ 4、pop() 删除数组中最后一个元素,并返回该元素的值。 使用说明请参见shift()方法 5、push(参数1,参数2...参数n) 将一个或多个元素添加到数组的结尾,并返回该数组的新长度。 var myarray:Array=new Array(5,8,"a"); var c = myarray.push("b","c"); //返回值是新数组的长度,而不是新的数组 trace("添加元素后数组的长度是:"+c); trace("添加元素后的数组:"+myarray); //原数组改变了 /* 输出结果是: 添加元素后数组的长度是:5 添加元素后的数组:5,8,a,b,c */ 6、unshift(参数1,参数2...参数n) 将一个或多个元素添加到数组的开头,并返回该数组的新长度 使用说明请参见push()方法 7、reverse() 就地倒转数组。(该方法内没有参数) var myarray:Array=new Array(5,8,"a"); trace("原数组是:"+myarray); myarray.reverse(); trace("被倒转后的数组是:"+myarray); /* 输出结果是: 原数组是:5,8,a 被倒转后的数组是:a,8,5 */ | |
8、sort() 对数组中的元素进行排序。默认情况下,按下面列表中的说明进行排序:
* 按升序排序(a 优先于b)。 * 排序区分大小写(Z 优先于a)。 * 修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。 * 数值字段按字符串方式进行排序,因此 100 优先于 99,因为 "1" 的字符串值比 "9" 的低。 var myarray:Array=new Array(3,4,"z",1,2,5,100,"a",345,"C",143); myarray.sort(); trace(myarray); //输出为:1,100,143,2,3,345,4,5,C,a,z 补充说明:该方法内可以加参数,从而实现个性的排序方式。 flash内置了几个预定的参数以实现常见的排序,当然,你还可以创建自己的自定义函数来进行排序。下面,我们逐一演示之: <1>flash内置的5个预定参数 Array.CASEINSENSITIVE 或 1 Array.DESCENDING 或 2 Array.UNIQUESORT 或 4 Array.RETURNINDEXEDARRAY 或 8 Array.NUMERIC 或 16 如上所示,可以用英文,也可以用数字。推荐大家用英文,而不是数字。因为数字没有什么特别意义,时间长了很快就遗忘了。但是英文都有特定意义,而且编程时,只要你输入了Array.(注意,有一个点)就会自动出现一个下拉列表,列表内就会出现上面的5个单词,也就是说,你无须记住单词的拼写,你只需记住单词的大致模样即可,超级省劲。 现在详述上面的5个参数: (1)第一个单词CASEINSENSITIVE其实可以分开来记忆case in sensitive 翻译成中文就是“敏感的情况”【额,学习AS编程时,很多代码都是英文中的单词,大家可以配合着有道词典或者金山词霸等语言翻译软件来记忆学习,最好将发音给弄清】。 CASEINSENSITIVE表示大小写不敏感,且按字母顺序排序 举例: var myarr | |
9、slice(A, B)
说明:A与B是原数组的索引 该方法返回一个字符串,该字符串包括从索引A代表的元素一直到索引B代表的元素(但不包括B代表的元素)之间的所有字符。本操作不修改原数组。 var myarray:Array=new Array(98,73,10,85,3); var myarray1:Array = myarray.slice(0,3); //从原数组的0位置(98)开始,直到3位置(85,但是不包括85)为止 var myarray2:Array = myarray.slice(1,4); //从原数组的1位置(73)开始,直到4位置(3,但是不包括3)为止 trace(myarray1); //输出结果是:98,73,10 trace(myarray2); //输出结果是:73,10,85 注意:如果slice(A, B)方法内的参数A(或者B)是一个负数,则起始点(或者终点)从字符串的结尾处向前数确定。其中-1表示最后一个元素。 var my_str:String = "WangYuFeifEI";//共有12个字符 //下面两行代码用于输出第一个字符 trace("slice(0,1): "+my_str.slice(0, 1)); //输出: slice(0,1): W trace("slice(-12,1): "+my_str.slice(-12, 1)); //输出: slice(-12,1): W //下面两行代码用于输出中间四个字符 trace("slice(4,8): "+my_str.slice(4, 8)); //输出:slice(1,4): YuFe trace("slice(4,-4): "+my_str.slice(4, -4)); //输出:slice(1,-1): YuFe //下面三行代码输出均为空。因为索引A的位置没有保证在索引B的前面 trace("slice(1,1): "+my_str.slice(1, 1)); //输出slice(1,1): trace("slice(3,2): "+my_str.slice(3, 2)); //输出slice(3,2): trace("slice(-2,2): "+my_str.slice(-2, 2)); //输出slice(-2,2): //下面两行代码,省略了参数B,那么系统认为B的值为字符串的长度(本例是12) trace("slice(0): "+my_str.slice(0)); // slice(0): WangYuFeifEI trace("slice(4): "+my_str.slice(4)); // slice(4): YuFeifEI 10、splice(A, [B], [C]) 定位到数组的索引A处,开始删除B个元素。同时,在删除的元素的位置处插入C元素。此方法会直接修改被操作的数组而不会不制作副本。 说明: ①参数A是原数组的索引,是一个整数。A一般用正整数比较容易理解,当然,A也可以是一个负整数,用来指定相对于数组结尾的位置(例如,-1 是数组的最后一个元素)。 ②参数B [可选] 是一个非负整数,它指定要删除的元素数量。该数量包括A参数中定位的元素。 如果没有为B参数指定值,则该方法将删除从A元素到数组中最后一个元素之间的所有值。 如果该参数的值为0,则不删除任何元素。 ③参数C [可选] 是指定要在A参数中定位的插入点处插入到数组中的值。 var myarray:Array=new Array(16,28,34,46,25); myarray.splice(1); trace(myarray); //输出结果为:16 本例在splice()方法中只用了一个参数1(就是我们所说的A),这是指:定位到索引是1的元素(28)的位置,进行删除、插入操作。 第二个参数(B)未设置,则将删除从第1个参数(就是数组在索引值为1的位置的元素,也就是元素28)开始的所有元素(包括元素28)。 第三个参数(C)未设置则不插入新元素。所以执行后数组中就只剩下第0号元素了。 var myarray:Array=new Array(16,28,34,46,25); myarray.splice(1,2); //从索引为1的位置(包括索引1位置的元素)开始删除两个元素 trace(myarray); //输出结果是:16,46,25 再看一例: var myarray:Array=new Array(16,28,34,46,25); myarray.splice(3,0,61,32,44); //从索引为3的位置开始删除0个元素,并在删除的位置上插入三个新元素61 32 44 trace(myarray); //输出结果是:16,28,34,61,32,44,46,25 注意该例,原数组索引3的位置,元素是46;参数B指定的是0,所以不删除数据;参数C可以有多个,用逗号隔开,用来在数组后面继续添加新元素。 注意,不是从元素46之后加入新元素,而是从元素46之前加入新元素 最后一例: var myarray:Array=new Array(16,28,34,46,25); trace(myarray.splice(1,3));//输出:28,34,46 也就是说,splice有返回值,返回的就是删除掉的所有元素。大家可以将splice(1,3)修改为splice(1,0)看看效果,来验证这个结论 | |