トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     Object型のプロパティに変数を使いたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
tnagata
Åê¹ÆNo.29420
投稿日時: 2006-10-18 10:10
常連
居住地:
投稿: 140
使用環境:
Flex2,, Flash5
OS:Windows 2000 SP4,,WindowsVista
IE5,6,7
Object型のプロパティに変数を使いたい
いつもお世話になっております。

よく使っている手法なんですが

var obj_array:Array = new Array();
obj_array.push({Name:"aaa", Value:1});
obj_array.push({Name:"bbb", Value:2});
obj_array.push({Name:"ccc", Value:3});

という形で配列内にObject型を仕込んでおいて


getValue("aaa", obj_array);
function getValue(str:String, ary:Array):Number
{
    var nLoop:Number = ary.length;
    for ( var i:Number = 0; i < nLoop; i++ )
    {
       if ( ary[i].Name == str )
       {
          return ary[i].Value;
       }
    }

    return -1;
}


等という具合に、Nameに割り当てた識別子を元に
値を返す・・・という処理を書いていたのですが

Object型になっている部分のプロパティ名が
変わるたびにgetValueの別パターンをいくつも作らないといけなかったので


getValue("aaa", obj_array, "Name", "Value");
function getValue(str:String, ary:Array, strID:String, strTarget):Number
{
    var nLoop:Number = ary.length;
    for ( var i:Number = 0; i < nLoop; i++ )
    {
       if ( ary[i][strID] == str )
       {
          return ary[i][strTarget];
       }
    }

    return -1;
}

としました。
まぁ、これである程度満足したのですが
気持ちとしては
ドットシンタックスで書きたいなぁと思っていまして

eval("ary[" + i + "]."+ strID)
のような参照をしてみたのですが、undefinedしか返ってこないので
ary[][]というような書き方しかないのかなぁと思っています。

他に書き方はないでしょうか?
ご存知の方いらっしゃれば、教えてください。

宜しくお願いします。
野中文雄
Åê¹ÆNo.29422
投稿日時: 2006-10-18 13:50
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: Object型のプロパティに変数を使いたい
とくに配列の値取出しを、配列アクセス演算子[]でなく「ドットシンタックスで書きたい」理由がわかりません。あえてお勧めする手法ではないです。
引用:
tnagataさんは書きました:
var obj_array:Array = new Array();
obj_array.push({Name:"aaa", Value:1});
obj_array.push({Name:"bbb", Value:2});
obj_array.push({Name:"ccc", Value:3});

という形で配列内にObject型を仕込んでおいて
...[中略]...
getValue("aaa", obj_array, "Name", "Value");
function getValue(str:String, ary:Array, strID:String, strTarget):Number
{
    var nLoop:Number = ary.length;
    for ( var i:Number = 0; i < nLoop; i++ )
    {
       // if ( ary[i][strID] == str )
       if (eval("ary."+i+"."+strID) == str)
       {
          return ary[i][strTarget];
       }
    }

    return -1;
}

としました。
まぁ、これである程度満足したのですが
気持ちとしては
ドットシンタックスで書きたいなぁと思っていまして

ターゲットのフィールド(プロパティ)が頻繁に変わるものでないなら、インデックスをかけておく方法も考えられます。インデックス化したオブジェクトには、ドットアクセスが使えます。
var objName:Object = xSetIndex(obj_array, "Name");
trace(objName.aaa.Value);
function xSetIndex(my_array:Array, field_str:String):Object {
	var objReturn:Object = new Object();
	var nLength:Number = my_array.length;
	for (var i:Number = 0; i<nLength; i++) {
		var obj:Object = my_array[i];
		objReturn[obj[field_str]] = obj;
	}
	return objReturn;
}


----------------
 

tnagata
Åê¹ÆNo.29423
投稿日時: 2006-10-18 15:11
常連
居住地:
投稿: 140
使用環境:
Flex2,, Flash5
OS:Windows 2000 SP4,,WindowsVista
IE5,6,7
Re: Object型のプロパティに変数を使いたい
別例まで作成していただきありがとうございました。
なんか、ものすっごい手が込んでいますね^^;

引用:

とくに配列の値取出しを、配列アクセス演算子[]でなく「ドットシンタックスで書きたい」理由がわかりません。

すみません、意味不明でしたね。
配列部分は、配列アクセス演算子[]、
フィールド部分はドットシンタックスというような書き分けを
ソースコードの中でやっていたのものですから
この関数のなかだけ、配列アクセス演算子[]だけで表記するのは嫌だな?と感じただけなのです。

つまり、今までソースコードの中では
ary[i].Nameのように記述していたので、他とあわせる意味では
似たような書式にしたいなぁと考えました。

eval("ary["+i+"]." + strID)
だと、アクセス出来なかったので、どうしたものかと書き換えていたら

ary[i][strID]で動いたわけです。
う?む。これだと二次元配列みたいな書式で嫌だな?とか考えましたので、お尋ねしたのが経緯です。

eval("ary." + i + "." + strID)
のように、ドットシンタックスだけなら、いけるんですね!
こう書けるという事は、配列アクセス演算子はシンタックスシュガーであって、実際はオブジェクト型の継承で、他の言語等の配列を模して作られた事が伺えますね。
#アレ?なんだろ、デジャヴかな、前もこんな事書いたような気がする・・・

それは、さておき、eval()の中だと「混ぜるとキケン!」もとい、ドットシンタックスと配列アクセス演算子をあわせて使うと動かないんですね。

勉強になりました。ありがとうございました。
野中文雄
Åê¹ÆNo.29425
投稿日時: 2006-10-18 15:38
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: Object型のプロパティに変数を使いたい
配列は、整数インデックスをエレメントのプロパティとする特別なObject(のサブクラス)です。Objectを連想配列と呼ぶ人(こと)もありますので、その表現にしたがえば件の配列は「二次元配列」と考えることもできます。

obj_array[0] -> {Value:1, Name:"aaa"}
obj_array[0]["Value"] -> 1
[変数のリストアップ]より引用:
変数 _level0.obj_array = [オブジェクト #3, クラス 'Array'] [
  0:[オブジェクト #4, クラス 'Object'] {
   Value:1,
   Name:"aaa"
  },
  1:[オブジェクト #5, クラス 'Object'] {
   Value:2,
   Name:"bbb"
  },
  2:[オブジェクト #6, クラス 'Object'] {
   Value:3,
   Name:"ccc"
  }
 ]

引用:
tnagataさんは書きました:
ary[i][strID]で動いたわけです。
う?む。これだと二次元配列みたいな書式で嫌だな?とか考えましたので、お尋ねしたのが経緯です。

一般に、ドットアクセスは、配列アクセスで書替えることが可能です。

参考:「ドット演算子と配列アクセス演算子

なお、ActionScript 3.0では、eval()関数は使えなくなります


----------------
 

tnagata
Åê¹ÆNo.29429
投稿日時: 2006-10-18 16:30
常連
居住地:
投稿: 140
使用環境:
Flex2,, Flash5
OS:Windows 2000 SP4,,WindowsVista
IE5,6,7
Re: Object型のプロパティに変数を使いたい
連想配列は、結構いい訳ですね。
わかりやすいです。
(感想そこかよ!というツッコミは無しでlol)

引用:

参考:「ドット演算子と配列アクセス演算子」

は、とても分かりやすい説明でした。特にドット演算子については、すごく整理されていて分かりやすかったです。
ありがとうございました。

引用:

なお、ActionScript 3.0では、eval()関数は使えなくなります。

これは、強烈です。

3.0を利用する事は、今のところ考えていないのですが
Flashの特徴でインパクトがあったのは
先ほどの連想配列等に代表されるような
変数名すら変数に出来るという事だと思っていました。

特にeval()は、最たる物だと思っていたので、驚きました。
ただ、使っていて思うのは、あまり変数名まで変数にしちゃうとプログラム分かりにくくならないかな(可読性という意味で)?と思うので、失くすのは賛成でもあり、
使ってて便利なので(コードの汎用性をアップする事ができるので)反対でもありと、、、複雑な気分です。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops