2016-11-13 4 views
0

私はこれがEval関連であると思います。AS3オブジェクトのキーに配列の値を割り当てる方法は?

ここでは、実行時に未知の長さの配列があります。 以下のように言ってやるが、例えば、私は、オブジェクトのキーとして配列から値を割り当てたい:私はeval.hurlantに頼る必要がある場合、私はシンプルでありたいかわからない

var myArr:Array = ['a','b','c',...]; //unknown length 
var finalValue:int = 20; 
var myObj:Object = new Object(); 

assignValueToObject(); 

//logics of assignValueToObject function 
/* 
    //TODO.. black box 
*/ 

//In the end, myObj has the value stored and can be accessed like this 
myObj["a"]["b"]["c"][...] = 20; 

これを行う方法(再帰またはsth)

+0

私は何 "このmyobjを理解していない[" "] [" B "] [" C "] [...] = 20 "を意味する。 AS3ではこの構文を見たことがありません。たぶんそれはちょうど私がAS3をかなり新しくしているので私のものかもしれませんが、それは私が今までそれを見た方法ではありません。私はこれがあらゆる種類のエラーを投げると期待します。オブジェクトを整数に設定しているためです。あなたはこれによって何を意味することができますか?オブジェクトは '='整数ではありません。それとも、オブジェクトに20のプロパティがあるということですか?これは非常に混乱している可能性があります。 –

+0

myObj = {"a":文字列、 "b":文字列、 "c":文字列、... "t":文字列}; ' –

+0

@NealDavis myObj別のオブジェクト(マルチレイヤー)を含むオブジェクトです。 myObj ["a"]の値は、キー "b"とキー "c"を含む別のオブジェクトの値を含むオブジェクトです。 JSON形式と見なすことができます: { "A":{ "B":{ "C":{ ... }} }} 私が望んでいた、まさに作品 – zeroflaw

答えて

2

単純にforループを使用して配列の要素を繰り返し、配列の最後の要素を除いてオブジェクトを作成します。これはオブジェクトではなく、目的の値。コードはテストされていません。もちろん

var myArr:Array = ['a','b','c',...]; //unknown length 
var finalValue:int = 20; 
var myObj:Object = new Object(); 

// variable that holdsthe msot recently created sub-object 
var currentObject = myObj; 

// create nested objects up to the second last property name 
for (var index:int = 0; index < myArr.length -1; ++i) 
{ 
    currentObject = currentObject[element] = {}; 
} 

// add value to last property 
currentObject[myArr[myArr.length -1]] = finalValue; 

あなたは多くのそのような値を挿入したい場合は、ネストされたオブジェクト構造は、すでにこれらの既存のものを上書きを避けるためにいくつかのプロパティが含まれているかどうかを確認する必要があります。

これはかなり複雑で、解決しようとしている実際の問題は、配列内の文字列としてプロパティ名を持つよりもはるかにエレガントに解決できる可能性が高いと言います。

+0

! 1〜2日後に回答に印を付けることができます。ありがとうございました! – zeroflaw

+0

確かに、もし@nullが何かを投稿するなら、これは貴重で、たぶん最善で短い答えです! AMOとして彼の投稿を受け入れるべきです。 – tatactic

+0

nullには多くの時間がかかりますので、フィードバックをお願いします。ありがとうございました! – tatactic

1

@nullは普通通りですが、私はこの例を追加して大きな数字を実現しました。 ...あなたはまた、ループ内でこれを初期化することができるので、あなたはあなたが(nullはあなたを示唆したように)何をしたいことにするだろう

var myArray:Array = ["a", "b", "c"]; 
var mySecondArray:Array = ["a", "b", "c"]; 
var myValues:Array = ["first element", "secondt element", "third element"]; 
var relValues:Array = [150, 75, 500]; 
var indexedValues:Array = [1, 2, 3]; 
var myObject:Object; 
var mySecondObject:Object; 
function converArraytToObject(myArray:Array, myValues:Array):Object{ 
    var o:Object=new Object(); 
    for(var i:uint = 0; i < myArray.length; i ++){ 
     o[myArray[i].toString()] = myValues[i].toString(); 
    } 
    return o; 
} 
trace(myObject["a"]); 
// outputs "first element" 
trace(myObject["b"]); 
// outputs "second element" 
trace(myObject["c"]); 
// outputs "third element" 
// or 
trace(" ***UNSORTED"); 
for (var j in myObject){ 
    trace ("index name = [" + j + "] = " +myObject[j]); 
} 
// or 
trace(" ***SORTED by index"); 
for (var k = 0 ; k < myArray.length ; k++){ 
    trace ("index name = [" + myArray[k] + "] = " + myObject[myArray[k]]); 
} 
//or 
trace(" ***UNSORTED"); 
for (var l in mySecondObject){ 
    trace ("index name = [" + l + "] = " + mySecondObject[l]); 
} 
//or 
trace(" ***SORTED by index"); 
for (var m = 0 ; m < myArray.length ; m++){ 
    trace ("index name = [" + myArray[m] + "] = " + mySecondObject[myArray[m]]); 
} 

OUTPUT:あなたは、同じインスタンスを格納する場合

クラス、私はあなたの代わりにベクトルクラスを使用することをお勧めします。

first element 
secondt element 
third element 
    ***UNSORTED 
index name = [c] = third element 
index name = [a] = first element 
index name = [b] = secondt element 
    ***SORTED by index 
index name = [a] = first element 
index name = [b] = secondt element 
index name = [c] = third element 
    ***UNSORTED 
index name = [c] = 3 
index name = [a] = 1 
index name = [b] = 2 
    ***SORTED by index 
index name = [a] = 1 
index name = [b] = 2 
index name = [c] = 3 

ActionScript 3 fundamentals: Arrays

ActionScript 3 fundamentals: Associative arrays, maps, and dictionaries

ActionScript 3 fundamentals: Vectors and ByteArrays

関連する問題