`

[转载][新闻资讯] [Flash/Flex] Adobe荐文:Array类编程

阅读更多
http://bbs.9ria.com/viewthread.php?tid=70786&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400

资讯类型: 翻译
来源页面: http://www.adobe.com/devnet/flash/quickstart/programming_arrays_as3.html
资讯原标题: Programming with the Array class
资讯原作者: Buck DeFore
我的评论:
对这篇文你有啥看法,跟贴说说吧!欢迎口水和板砖,哈哈。欢迎大家和我们一同分享更多资讯。

本文阅读要求:
具备知识:
建议具备ActionScript 3编程经验.
用户水平:
初级

需要产品:
Flash Professional
样例:
ArrayMapMethod.zip
ArraySearchMethods.zip

数组是一种很重要的数据结构。数组最基础的用途是存放对象的容器。数组使维护和修改相关对象变得非常简单。当你处理一系列拥有相同特性的变量时,数组的方便性就更显而易见了。比如,你有一个列表的联系人,你可以把它们放入一个数组,这时数组就成为了一个通讯录,你可以很方便的遍历,或者提取想要的条目来进行修改。

下面的章节详细介绍了数组编程的细节。

数组类型

最常见的数组是索引数组。这个类型中,数组中的每一个元素都有一个索引值。AS3中的数组是以0为基数的;数组中第一个元素的索引是0,第二个的索引是1,以此类推。你可以通过中括号操作符 ( [ ] )来获取指定索引的元素: // Create a new array, adding three elements to it

var arr:Array = new Array("a", "b", "c");

trace(arr); // output: a,b,c



// Overwrite the third item (at index 2) with a new string

arr[2] = "aa";

// Set the third index to a new string

arr[3] = "bb";



trace(arr); // output: a,b,aa,cc
复制代码数组中可以包含其他数组。这称作多维数组。数组可以被看作是一行,其中每个元素可以看作是一列。如果一个数组中每个元素包含一个数组,这就是一个二维数组,可以被放入一个很多行和很多列组成的网格中。一个位图可以用一个二维数组来描述,其每个元素都是一行包含每列元素的数组。每列元素包含每个像素的色彩信息: // Create a new array

var arr:Array = new Array();

arr[0] = new Array("a", "b", "c");

arr[1] = new Array("d", "e", "f");

arr[2] = new Array("g", "h", "i");



trace(arr); // output: a,b,c,d,e,f,g,h,i

trace(arr[0]); // output: a,b,c

trace(arr[0][0]); // output: a

trace(arr[0][1]); // output: b

trace(arr[0][2]); // output: c

trace(arr[2][2]); // output: i        
复制代码最后一种类型的数组是关联数组,常被称作hash或map。这种数组不含索引,但相应的用键来指引元素。AS3中,关联数组的功能和一个Object类是相同的。关联数组的键值可以被看作是对象的属性。这样,你就可以用对象或数组的语法来创建关联数组: // Create a new array

var indexedArray:Array = new Array();

// Assign index 0 to a new string

indexedArray[0] = "bob";

trace(indexedArray[0]); // output: bob

trace(indexedArray.length); // output: 1



// Create a new array

var associativeArr:Array = new Array();

// Assign a new string to key "name", making the array associative

associativeArr["name"] = "bob";

trace(associativeArr["name"]) // output: bob

trace(associativeArr.length); // output: 0 (length method unavailable to associative arrays)



var obj:Object = new Object();

obj.name = "bob";

trace(obj.name); // output: bob
复制代码注意,不管你是如何创建的关联数组,它始终是一个未排序的键值对,正因如此,它不具备索引数组的特性。一旦一个数组被赋予了键值对,这个数组就无法使用length() 方法来确定里面包含的元素个数。

修改数组内容

你可以使用中括号操作符来对指定索引赋值,你也可以用Array类的方法在数组的开始和结尾加入或删除元素。在数组末尾添加一个元素,使用push()方法。在数组开始增加一个元素使用unshift()方法。你也可以使用 shift()和pop()方法在数组的开头和末尾删除元素。以下的例子展示了这些方法的区别: var arr:Array = new Array();

arr.push("green");

arr.push("blue");

arr.push("violet");

trace(arr); // output: green,blue,violet



arr.unshift("yellow");

arr.unshift("orange");

arr.unshift("red");

trace(arr); // output: red,orange,yellow,green,blue,violet



// Remove the last item from the array

var lastItem:String = arr.pop();

trace(lastItem); // output: violet

// Remove the first item from the array

var firstItem:String = arr.shift();

trace(firstItem); // output: red



trace(arr); // output: orange,yellow,green,blue
复制代码你可以使用splice()方法在数组中间添加或删除元素。splice()方法的第一个参数是起始修改元素的索引: // Create an array with two strings

var arr:Array = new Array("black", "white");



// Add two to the beginning

arr.splice(0, 0, "red", "orange", "yellow");
复制代码如果你是增加元素,第二个参数设为0,后面跟要加的元素: // Add colors to the end

arr.splice(5, 0, "green", "blue", "violet");
复制代码如果你要删除元素,第二个参数设为要删除元素的个数: // Remove two in the middle, starting at the third index

arr.splice(3,2);
复制代码你可以用slice()或concat()方法,以现有的数组来创建新数组。slice()方法返回一个现有数组的子集。concat()方法返回所传给它的参数的合并集。传递给这两个方法的原有数组保持不变。 // Create a combined array without changing an initial array

var initialArray:Array = new Array("red", "orange", "yellow");

// Create an array that combines the initial array with three more strings

var combinedArray:Array = initialArray.concat("green", "blue", "violet");

// Create a subset of this array without changing the original

var slicedArray:Array = combinedArray.slice(3);



trace(initialArray); // output: red,orange,yellow

trace(combinedArray); // output: red,orange,yellow,green,blue,violet

trace(slicedArray); // output: green,blue,violet          
复制代码
传递数组中的元素给回调函数

数组类的方法使查询数组内元素和修改元素变得方便。这一节将详细介绍。

数组类的五个方法使用回调函数:every(), some(), forEach(), map(),和filter()。这些方法将函数当作一个参数。数组中的每个元素调用一次指定的函数。每个回调函数要有三个参数:第一个是数组中元素的指针,第二个是该元素的索引,第三个是数组本身。

这些回调函数可以方便的在数组内所有元素上执行代码。比如,你可以用forEach()方法得到数字内所有元素:var arr:Array = new Array(  { country:"Cameroon", continent:"Africa" },

                            { country:"Laos", continent:"Asia" },

                            { country:"Uruguay", continent:"South America" },

                            { country:"Romania", continent:"Europe" },

                            { country:"Canada", continent:"North America" } );



arr.forEach(traceContinent);





function traceContinent(element:*, index:int, arr:Array):void {



    trace(element.country + " is found in " + element.continent);

}
复制代码map()方法和forEach()相似,但它返回的是回调函数所返回的新数组。这个例子创建了一个DataProvider实例,用来格式化填充列表。 (注意你需要FLA的list组件来进行编译):import fl.controls.Button;

import fl.controls.DataGrid;

import fl.controls.List;

import fl.data.DataProvider;



var famousWorks:Array = new Array(  { author:"Homer", work:"The Iliad" },

                                    { author:"Jules Verne", work:"Journey to the Center of the Earth" },

                                    { author:"James Joyce", work:"Ulysses" },

                                    { author:"John Steinbeck", work:"Grapes of Wrath" },

                                    { author:"Allen Ginsberg", work:"Howl" } );



// create grid to show initial array

var grid:DataGrid = new DataGrid();

grid.width = 350;

grid.height = 125;

grid.move(10, 10);

grid.dataProvider = new DataProvider(famousWorks);

addChild(grid);



// create list for formatted output

var list:List = new List();

list.width = 350;

list.move(10, 180);

list.rowCount = famousWorks.length;

addChild(list);



// create button to trigger the map method

var mapBtn:Button = new Button();

mapBtn.x = 80;

mapBtn.y = 10 + grid.height + 10;

mapBtn.width = 200;

mapBtn.label = "Format using Array.map()";

addChild(mapBtn);



mapBtn.addEventListener(MouseEvent.CLICK, onMapButtonClick);



function onMapButtonClick(evt:MouseEvent):void

{

        // generate a formmatted list using the map() method

        var formattedWorks:Array = famousWorks.map(formatFamousWork);

        var dp:DataProvider = new DataProvider(formattedWorks);

        list.dataProvider = dp;

}



function formatFamousWork(element:*, index:int, arr:Array):String {

    return element.work + " (by " + element.author + ")";

}
复制代码
这个例子的源码在本文最上方ArrayMapMethod.zip中。Flash Professional CS5版本FLA文件是ArrayMapMethod_CS5.fla。

你可以使用filter()方法来创建另一个数组的子集。在filter()方法的回调函数中,如果数组元素需要在新数组中保留则必需返回true,反之返回false。下面的例子随机产生100个0-100的随机数组成数组,使用filter()方法来创建大于90的数组子集:var arr:Array = new Array();



var totalElements:uint = 100;

for(var i:uint = 0; i<totalElements; i++) {



    arr[i] = Math.round(Math.random()*100);

}



function isLargerThan90(element:*, index:int, arr:Array):Boolean {

    return element > 90;



}

var highestNumbers:Array = arr.filter(isLargerThan90);

trace(highestNumbers);
复制代码every()和some()方法要求回调函数返回一个布尔值。every()方法对数组中每个元素执行回调函数,直到回调函数返回false。相似的,some()方法对每个元素执行回调函数直到返回true。这个动作可以用来确定数组是否达到每个标准。下面的例子确定一个数组是否都是由字符串组成:var arr:Array = new Array();

var totalElements:uint = 1000;



for(var i:uint = 0; i<totalElements; i++) {

    arr[i] = "name";

}



trace("Array is entirely composed of strings: " + arr.every(hasOnlyStrings));



function hasOnlyStrings(element:*, index:int, arr:Array):Boolean {

    return element is String;

}



arr[42] = 81; // change one element to a number



trace("Array is entirely composed of strings: " + arr.every(hasOnlyStrings));
复制代码  数组中搜索元素

你可以用indexOf()或lastIndexOf()方法寻找数组中的元素。这些方法使用优化的搜索方法,比自定义的搜索循环有更好的表现。下面的例子比较用indexOf()方法搜索、循环搜索和for each搜索:// assumes having two components on the screen:

// 1. A TextArea named outputTxt

// 2. A Button named startBtn



var loopCount:Number = Math.pow(10,6);

var loopingTally:uint = 0;

var forEachTally:uint = 0;

var indexOfTally:uint = 0;

var testsToMake:uint = 5;



// Create a large array composed entirely of zeroes

var a:Array = new Array();



for (var i:uint=0; i<loopCount; i++)

{

    a[i] = 0;

}



// Start a timer that will start a new test every half-second, up to the total tests needed

var t:Timer = new Timer(500,testsToMake);

// Run the makeTest function every time the timer ticks

t.addEventListener(TimerEvent.TIMER,makeTest);

// When the timer has completed, run the showResults function

t.addEventListener(TimerEvent.TIMER_COMPLETE,showResults);

t.start();



function findByLooping(toSearchFor:Number):uint {

    var start:int = getTimer();

    for (i=0; i<loopCount; i++)

    {

        if(a[i] == toSearchFor) {

            var end:int = getTimer();

            var elapsed:int = end - start;

            trace ("Found " + toSearchFor + " by looping at index: " + i + " time: " + String(elapsed));

            break;

        }

    }

    return elapsed;

}

function findByForEach(toSearchFor:Number):uint {

    var start:int = getTimer();

    for each(var entry:Number in a)

    {

        if(entry == toSearchFor) {

            var end:int = getTimer();

            var elapsed:int = end - start;

            trace ("Found " + toSearchFor + " in for each loop at time: " + String(elapsed));

            break;

        }

    }

    return elapsed;

}

function findByIndexOf(toSearchFor:Number):uint {

    var start:int = getTimer();

    var foundIndex:int = a.indexOf(toSearchFor);

    var end:int = getTimer();

    var elapsed:int = end - start;

    trace ("Found " + toSearchFor + " by indexOf() at index: " + foundIndex + " time: " + String(elapsed));

    return elapsed;

}

function makeTest(e:TimerEvent):void {

    // Get a random number

    var randomNumber:Number = Math.random();

    // Assign it to a random index in our dummy array

    a[Math.floor(Math.random()*loopCount)] = randomNumber;

    // Find it, timing various methods

    loopingTally += findByLooping(randomNumber);

    forEachTally += findByForEach(randomNumber);

    indexOfTally += findByIndexOf(randomNumber);   

}

function showResults(e:TimerEvent):void {

    trace("== Average search time by looping: " + loopingTally/testsToMake);

    trace("== Average search time by for each: " + forEachTally/testsToMake);

    trace("== Average search time by indexOf: " + indexOfTally/testsToMake);

}
复制代码这是一些样例输出:== Average search time by looping: 134.6

== Average search time by for each: 26

== Average search time by indexOf: 6.4
复制代码可以看出,使用indexOf()方法比另外两种方法都要快。

点击Start按钮开始测试: 这个例子的源码在本文最上方ArraySearchMethods.zip中。Flash Professional CS5版本FLA文件是ArraySearchMethods_CS5.fla。

深入学习

关于排序数组的更多信息,请参考ActionScript 3.0 Reference的Array类,包含使用sort()和sortOn()方法的详细介绍。 播放列表的例子在 ActionScript 3.0 Developer's Guide中的"Working with arrays"章节。
分享到:
评论

相关推荐

    Flex4 中文API

    这个框架基于ActionScript编程语言和Flash Player或Adobe AIR运行时环境,能够创建高度交互、视觉效果丰富的Web应用。Flex4中文API文档是开发者的重要参考资料,它以CHM(Compiled Help Manual)格式提供,便于离线...

    chat.zip_FlashMX/Flex源码_FlashMX_

    Flash MX/Flex是Adobe公司推出的一系列用于创建交互式Web内容的开发工具。Flash MX以其强大的动画制作能力和丰富的交互性,一度成为网页设计的主流技术。而Flex是基于ActionScript 3.0的开发框架,专为构建富互联网...

    flex多曲线图,实时更新

    在IT行业中,Flex是一种基于ActionScript 3.0和Flash Player的开源框架,用于构建富互联网应用程序(RIA)。本文将详细探讨如何使用Flex创建多曲线图,并实现实时更新功能。 一、Flex概述 Flex是Adobe开发的一个...

    Flex中文API

    Flex中文API是Adobe Flex开发平台的重要参考资料,它为开发者提供了详细的API接口说明,帮助开发者更好地理解和使用Flex框架来构建富互联网应用程序(RIA)。Flex是一种基于ActionScript和MXML的开源框架,主要用于...

    Adobe提供的Flex解析Json的ActionScript包

    Adobe Flex是一种开源的框架,主要用于构建富互联网应用程序(RIA),它使用ActionScript编程语言和MXML标记语言。在处理数据交换时,特别是与服务器进行异步通信时,JSON(JavaScript Object Notation)格式因其轻...

    Adobe Flex 编码规范

    Adobe Flex 是一个开源框架,主要用于构建富互联网应用程序(RIA),它使用ActionScript编程语言和MXML标记语言。在开发Flex项目时,遵循一套编码规范至关重要,这有助于提高代码的可读性、可维护性和团队协作效率。...

    Adobe flex3.pdf

    ### Adobe Flex 3 开发者指南:ActionScript 3.0 编程基础 #### 一、概述 《Adobe Flex 3》开发者指南是专为希望深入掌握使用ActionScript 3.0 开发应用程序的技术人员准备的一份详尽文档。这份手册不仅提供了关于...

    Adobe.ActionScript.3.0.编程.2008

    《Adobe ActionScript 3.0 编程 2008》是一本专注于ActionScript 3.0技术的官方中文帮助文档,对于想要深入学习AS3.0的初学者而言,无疑是一份极其宝贵的资源。ActionScript是Adobe开发的一种脚本语言,主要用于...

    Flex3中用到的工具类包,含有json类

    Flex3是Adobe开发的一款用于构建富互联网应用(RIA)的框架,它基于ActionScript 3.0编程语言和Flash Player运行环境。在这个标题为“Flex3中用到的工具类包,含有json类”的资源中,我们可以看到它包含了处理JSON...

    flash as3中文API

    在Adobe Flash Professional的开发环境中,ActionScript 3(AS3)是核心编程语言,它为创建交互式内容、动态图形和丰富的互联网应用程序提供了强大的支持。AS3的API(Application Programming Interface)是开发者...

    flex中给图片或任意组件着色的方法

    2. **颜色过滤器(ColorMatrixFilter)**:Flex提供了`flash.filters.ColorMatrixFilter`类,它可以通过调整像素的RGB值来改变图像颜色。例如,我们可以创建一个颜色矩阵来实现饱和度、亮度、对比度的调整,或者直接...

    Flex完全自学手册

    在Flex 1.5及之前版本中,实现这一功能较为复杂,需要通过Flash Player API中的`FileReference`类来进行操作。而到了Flex 2.0,这个类被集成到了Flex类库中,使得上传下载功能变得更加简便易用。 #### 技术背景与...

    Flash,Flex和AIR应用开发内存监测及优化技巧

    Flash、Flex和AIR是Adobe公司推出的RIA(富互联网应用)开发平台的重要组成部分。它们广泛应用于开发网络应用程序和桌面应用程序。在这些平台上开发应用时,内存管理是保证程序稳定运行的重要方面。内存监测及优化...

    flex读取excel(含中文字符)的解决

    本文将探讨如何在Adobe Flex中读取包含中文字符的Excel文件,主要涉及使用AS3XLS库来解决这个问题。 首先,AS3XLS是一个ActionScript 3的开源库,专门用于处理Microsoft Excel文件。它允许Flex应用程序创建、读取和...

    flex android开发学习好实例

    在本文中,我们将深入探讨如何使用Adobe Flex进行Android应用程序开发,并通过一个具体的“list”控件实例来学习Flex在Android平台上的应用。Flex是一种强大的开放源代码框架,它基于ActionScript编程语言,用于构建...

    flex flash实现mmorpg包裹DEMO

    本篇文章将深入探讨如何利用Adobe Flex和Flash技术,结合ActionScript 3(AS3)来构建一个功能完善的MMORPG背包系统DEMO。 一、Flex与Flash概述 Flex是一种基于开放源代码的MXML和ActionScript框架,用于构建富...

    Flex+BlazeDB+mysql实现数据交互

    Flex是一款强大的开发工具,用于创建互动丰富的基于Flash的用户界面。在Flex应用中,数据交互主要通过RemoteObject组件来实现,它可以调用后台Java或.NET服务,从而进行CRUD(创建、读取、更新和删除)操作。 **...

    vt.zip_flex

    1. **Adobe Flex架构**:Flex框架由Flex SDK和Flex Builder(现在称为Flash Builder)组成,SDK包含编译器、库和工具,用于创建Flex应用程序,而Builder则提供了一个集成开发环境(IDE)来简化开发过程。 2. **...

    flex题目大全

    - Flex Builder 4同样支持多种项目类型,包括Flex项目、Flex Mobile项目、Adobe AIR应用程序等。 #### 26. 什么是RSL,如何使用? - **答案**:RSL(Runtime Shared Library)是在运行时按需加载的共享库。使用...

Global site tag (gtag.js) - Google Analytics