イナヅマTVログ

ActionScript 3, ArrayとObjectのクローン(複製・コピー・copy)を作る

| 4件のコメント

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: オブジェクトの基本操作の実現、で複製・コピーの話があったのでリンクしておきます。

比較 – 二つのオブジェクトが等価か比較する
複製 – あるオブジェクトと等価な新しいオブジェクトを作成する
コピー – あるオブジェクトと等価になるように値を設定する

まだ使ったことはないのですが、とても魅力的なライブラリのようです。

4件のコメント

  1. ピンバック: Tweets that mention イナヅマtvログ » Actionscript 3, ArrayとObjectのクローン(複製)を作る -- Topsy.com

  2. ピンバック: ActionScript 3, 配列とオブジェクトを複製する – 2 | イナヅマtvログ

  3. ピンバック: ActionScript 3, 配列を定数にしても参照側から書換えられる | イナヅマtvログ

  4. ピンバック: ActionScript 3, 定数のように扱える配列型変数のお勉強 « イナヅマTVログ

コメントを残す

必須欄は * がついています


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください