.6 Array:多种数据结构的集合 Array也是object的一种。 Array是多种数据结构的集合。 在帮助文档中查一查 Array class 就会找到Array的说明。 Array实现了堆栈和队列: Array.push Array.pop Array.shift Array.unshift 这是flash更加不需要链表的理由。 Array 也是一个Object,不过有不少特权,比如,你可以这样定义一个Array:
var a = []; var b = [10, 20 ,30]; var c = new Array(1,2,3); var 2DArray = [[1, 3, 10] , [21, 5, 9 ]]; var myArray = [["hehe" ,12] , 78 , a];
系统会把上面的东东自动处理成数组。 多维数组 所有object都是1维的,数组也不例外。 多维数组实际上每个元素都是一个小数组的引用。 比如:
var 2DArray = [[1, 3, 10] , [21, 5, 9 ]];
那么 2DArray 有两个成员: 2DArray[0] 和 2DArray[1] 分别引用 [1,3,10] 和 [21,5,9] 托flash语法的福,所有多维数组应有的访问方法他都“自然而然”的拥有了:
2DArray //2DArray这个引用 2DArray[0] //2DArray[0]这个引用 2DArray[0][1] //2DArray[0]的第二个元素,值为3 注意,和object一样,你必须首先将a建立成一个数组,然后才能使用 a[<index>]来添加子项。比如:
//直接写 a[0] = 10; //错误。只有object才能添加子项。你试试trace(a[0]),结果是 undefined a = [] a[0] = 10; //正确 Array有一些属性(注意,属性不在 for in 作用范围内),比如Array.length返回数组的大小。另外,他重载了Array.toString方法,所以trace(Array)会显示一排东东~~~ 数组的下标是从0开始的。 //---------------------------------------------------------------------------------------------- var a = [10,20,30] trace(a); trace( a. length); //看看这个有趣的事:我们跳着定义,直接定义a[10] a[10] = 40; trace(a); trace( a.length);
结果是:
10,20,30 3 10,20,30,undefined,undefined,undefined,undefined,undefined,undefined,undefined,40 11 呵呵,中间的值都被空起来了。所以,做展开的稀疏矩阵还是用object比较好
Array.sort(); 和
Array.sortOn(name); 他们对数组的每一个元素排序。 这两个函数在 6和 7里面的表现完全不同。 这两个方法在 mx里面不好用。 首先,他们是对字符串排序,所以数字1,2,3,4,5,6,7,8,9,10会被排成 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 (寒一个……) 第二,效率不高,应该是用as实现的。 在2004里面,这两个排序都有了可选参数,可以提供对数字的排序,更重要的是速度大增,怀疑这次排序由内核实现的。 //----------------------------------------------------------------------------------------------
a = []; for(var i =0;i<21;i++) a[i] = i; a.sort(); trace(a); a.sort(Array.NUMERIC); trace(a);
//---------------------------------------------------------------------------------------------- 结果
0,1,10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 第一次就是标准的flash6排序的结果,乱七八糟~~~小心哦~~~~ 我在6里面解决的方法是:所有排序数都加上一个大数再参与排序,比如 0 就是10000, 10就是10010 ……如此曲折阿。 如何复制一个数组呢? 由于Array也是object,所以数组名也是引用,如果你像这样复制数组的话,得到的只是员数组的引用而已:
a=[1,2,3] b=a; a[0] = 10; trace(b); 结果:10,2,3 b当然也变了,因为a和b根本都在引用同一个数组嘛 那么如何复制呢? 函数 Array.slice(IndexA, IndexB) 返回数组的 IndexA、IndexA+1......IndexB-1的部分构成的新数组,如果IndexB未定义则一直返回到最后一个元素。 所以对于简单数组,我们可以:
b = a.slice(0); 然而同样的,如果数组中的元素是引用的话,新数组中对应元素也是引用……所以对于一个典型的二维数组:
a= [ [1,2,3], [4,5,6]]; b = a.slice(0); 那么b 就得到一个新的数组,但是只有两个元素:b[0]和b[1],他们仍然引用着a[0] a[1]引用的那两个数组…… 你在后面加上:
a[0][0] = 100; trace(b[0][0]); 就明白这种方法失败了…… 对于复杂数组,系统并没有提供方便的复制方法,你必须明白你自己数组的结构。比如上述2维数组,你需要模仿a重购一个同样的数组,他的每一个成员都是a的对应成员的复制品:
b = []; for (var i in a){ b[i] = a[i].slice(0); }
a= [ [1,2,3], [4,5,6]]; b = []; for (var i in a){ b[i] = a[i].slice(0); } a[0][0] = 100; trace(a[0][0]); trace(b[0][0]);
结果是 100 1
|