Array型とObject型変数は別の変数に=演算子を使っても、置き換わる(代入)のでは無く参照(リファレンス)を渡してるだけです。
ActionScriptに限った話では無くどの言語にも共通の振る舞いです。
て、分かっていても時々やらかしちゃう。
気を引き締めないとってハマるたびに思うんだけどなぁ・・・
var lists:Array = [10,20,30,40]; trace("lists", lists); // lists 10,20,30,40 var copied:Array = lists; copied[0] = "change"; trace("lists", lists); // lists change,20,30,40 |
配列を複製(クローン、コピー)は Array.concat
を使うと可能です。
var lists:Array = [10,20,30,40]; trace("lists", lists); // lists 10,20,30,40 var cloned:Array = lists.concat(); cloned[0] = "modify"; trace("modify", cloned); // modify modify,20,30,40 trace("lists", lists); // lists 10,20,30,40 |
concat
がないObject型の複製(クローン、コピー)は他の方法を考えないといけません。
for in
を使ってグルグルぶん回すって方法はありますけど、ちょっと面倒くさい。
一次元ならまだしも二次元になってたり、一次元でも要素が配列だったりすると、って考えるとかなり面倒になりそうです。
Adobeのサイトに解決方法がありました。
そのものズバリ Cloning arrays
http://livedocs.adobe.com/flex/3/html/help.html?content=10_Lists_of_data_6.html
日本語
http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html
import flash.utils.ByteArray; function clone(source:Object):* { var myBA:ByteArray = new ByteArray(); myBA.writeObject(source); myBA.position = 0; return(myBA.readObject()); }
この関数を使うとArrayもObjectも複製可能です。
// Array var lists:Array = [10,20,30,40]; var listsClone = clone(lists); listsClone[0] = "change"; trace("listsClone", listsClone); // listsClone change,20,30,40 trace("lists", lists); // lists 10,20,30,40 |
Object型も…
var objects = {apple:10, orange:20, banana:30, melon:40}; var objectsClone:Object = clone(objects); objectsClone.apple = 1010; // apple:1010, orange:20, banana:30, melon:40}; // objects // {apple:10, orange:20, banana:30, melon:40}; |
Flex 3 のヘルプなので、ずいぶん前の情報だったことにまず驚いた。
ByteArray
って色んなことができるんだなぁ。
ByteArray.writeObject // バイト配列に AMF 直列化形式でオブジェクトを書き込みます。 ByteArray.readObject // バイト配列から AMF 直列化形式でエンコードされたオブジェクトを読み取ります。 |
ByteArray.writeObject
で AMF 化して ファイルポインターを先頭に戻して ByteArray.readObject
で取出すんですね。
わかったことにしておこう。
HELPはちゃんと見ないといけない、とまた肝に銘じた。
多次元配列もコピーできる!
エライぞ!
update
@beinteractiveさんのブログでご自身のBEFoundationライブラリの解説が行われています。
ArtisticCoding: オブジェクトの基本操作の実現、で複製・コピーの話があったのでリンクしておきます。
比較 – 二つのオブジェクトが等価か比較する
複製 – あるオブジェクトと等価な新しいオブジェクトを作成する
コピー – あるオブジェクトと等価になるように値を設定する
まだ使ったことはないのですが、とても魅力的なライブラリのようです。
ピンバック: Tweets that mention イナヅマtvログ » Actionscript 3, ArrayとObjectのクローン(複製)を作る -- Topsy.com
ピンバック: ActionScript 3, 配列とオブジェクトを複製する – 2 | イナヅマtvログ
ピンバック: ActionScript 3, 配列を定数にしても参照側から書換えられる | イナヅマtvログ
ピンバック: ActionScript 3, 定数のように扱える配列型変数のお勉強 « イナヅマTVログ