天天看點

揭開AS程式的外紗(八) -- 容易被忽視的數組實用功能

<b>  1. length</b><b>屬性用來删除數組元素</b>

<b>    </b>假設我們定義了這樣一個數組:

<b>    </b>var arr:Array = new Array("first","second","third","four","five");

<b>    </b>我想删除後面3個元素,怎麼做最友善呢?

<b>    </b>答案:用length屬性!

<b>    </b>arr.length = 2;

<b>    </b>運作之後,立即達到想要的效果。

<b>    </b><b>2. </b><b>用splice删除元素、插入元素</b>

<b>    </b>splice是一個非常實用的指令,即可以用來删除元素,也可以用來插入元素,你都會用不?

<b>    </b><b>(1) </b><b>删除元素</b>

<b>    </b>假設還是上面那個數組,我要删掉中間第2到第4三個值,要怎麼做呢?

<b>    </b>答案是:arr.splice(1,3);

<b>    </b>如果用arr.splice(2);效果和arr.length = 2一樣!也是删除數組的利器!

<b>    </b><b>(2) </b><b>插入元素</b>

<b>    </b>如果我要在第二個元素後面插入"old"和"new"這2個元素,要怎麼做呢?

<b>    </b>答案是:arr.splice(2,0,"old","new");

<b>    </b>splice的參數說明我就不寫了,大家看下幫助文檔吧。這個方法是非常實用的!

<b>    </b><b>3. </b><b>怎麼樣才能最友善的複制數組?</b>

<b>    </b><b>(1) </b><b>用slice指令複制數組(淺複制)</b>

<b>    </b>還是以上面的那個數組為例,我要複制這個數組,怎麼樣最友善呢?

<b>    </b>答案:var newarr:Array = arr.slice();

<b>    </b>這裡我提到一個淺複制的概念。什麼是淺複制呢?就是說,如果這個數組和示例中那樣,都是由基中繼資料組成(int、uint、number、string等),那麼用slice方法可以完全複制!但如果這個數組的元素包含object,那麼複制下來的隻是一個指針,如果對該元素做修改,原來那個數組的該元素也同樣會被修改,是以叫淺複制!

<b>    </b>我舉個例子,在第一幀寫入代碼如下:

<b>    </b>var tobj:Object = {tt:5}; //定義一個object

<b>    </b>var tarr:Array = new Array(tobj); //定義一個數組

<b>    </b>var carr:Array = tarr.slice(); //用slice方式複制數組

<b>    </b>trace(tarr[0].tt); //輸出:5

<b>    </b>carr[0].tt = 6; //修改複制的數組的第一項

<b>    </b>trace(carr[0].tt); //輸出:6

<b>    </b>trace(tarr[0].tt); //輸出:6

<b>    </b>從該例子可以清楚的看到,slice隻能實作淺複制,但其實已經非常實用了!

<b>    </b><b>(2) </b><b>如何實作深複制?</b>

<b>    </b>如果真的有必要用到深複制,那麼隻能自己寫函數了。我下面寫一個示例,實作深複制。用到的具體方法就不詳細叙述了,如果大家有需要直接搬過去用就可以了!

<b>    </b>var tobj:Object = {tt:5};

<b>    </b>var tarr:Array = new Array(tobj);

<b>    </b>var carr:Array = depthCopy(tarr);

<b>    </b>carr[0].tt = 6;

<b>    </b>//該函數實作深複制

<b>    </b>function depthCopy(source:Array) {

<b>    </b><b>    </b>var by:ByteArray = new ByteArray();

       by.writeObject(source);

       by.position = 0;

       return(by.readObject());

<b>    </b>}

    這三個方法,在平時的使用中都是很實用的,但也是比較容易被忽視的。希望大家都能熟練這三個用法!

本文轉自 windtoto 51CTO部落格,原文連結:http://blog.51cto.com/windtoto/383920,如需轉載請自行聯系原作者

繼續閱讀