2016-11-13 5 views
0

Ich denke, das ist Eval-verwandt.AS3 Wie weisen Sie den Keys eines Objekts den Wert eines Arrays zu?

Hier habe ich ein Array unbekannter Länge in der Laufzeit. Nehmen wir zum Beispiel möchte ich die Werte aus dem Array als die Schlüssel des Objekts zuweisen, wie unten:

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; 

Ich bin nicht sicher, ob ich zu eval.hurlant zurückgreifen müssen, möchte ich es ein einfaches Um dies zu tun (entweder Rekursion oder etw.)

+0

Ich verstehe nicht, was "myObj [" a "] [" b "] [" c "] [...] = 20 "bedeutet. Ich habe diese Syntax in AS3 nie gesehen. Vielleicht bin ich nur, weil ich ziemlich neu in AS3 bin, aber so habe ich es noch nie gesehen. Ich würde erwarten, dass dies alle möglichen Fehler verursacht. Weil Sie ein Objekt gleich einer Ganzzahl setzen. Was könntest du möglicherweise damit meinen? Ein Objekt kann nicht '=' eine ganze Zahl sein. Oder meinst du, es gibt 20 Eigenschaften im Objekt? Das ist sehr verwirrend –

+0

vielleicht meinst du es so zu schreiben wie 'myObj = {" a ": String," b ": String," c ": String, ..." t ": String};' –

+0

@NealDavis myObj ist ein Objekt, das ein anderes Objekt (Multilayer) enthält. Der Wert von myObj ["a"] ist ein Objekt, das den Schlüssel "b" und den Wert eines anderen Objekts enthält, das den Schlüssel "c" und ... enthält Sie können es als ein JSON-Format betrachten: { "a": { "b": { "c": { ... } } } } – zeroflaw

Antwort

2

Verwenden Sie einfach eine for-Schleife, um über die Elemente des Arrays zu iterieren und die Objekte mit Ausnahme des letzten Elements des Arrays zu erstellen, das kein Objekt, sondern der gewünschte Wert sein soll . Code nicht getestet.

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; 

Natürlich, wenn Sie Sie viele solche Werte einfügen wollen, müssen prüfen, ob die geschachtelte Objektstruktur bereits einige der Eigenschaften enthält zwingende diese bestehende zu vermeiden.

Ich muss sagen, das sieht ziemlich verworren aus und es besteht eine hohe Wahrscheinlichkeit, dass das eigentliche Problem, das Sie lösen wollen, viel eleganter gelöst werden kann, als wenn Eigenschaftsnamen als Strings in einem Array stehen.

+0

genau funktioniert, was ich wollte! Erlaube mir, die Antwort nach 1-2 Tagen zu markieren. Vielen Dank! – zeroflaw

+0

Sicher, wenn @null etwas posten ist dies wertvoll und wahrscheinlich die beste und kürzere Antwort! Sie sollten seinen Beitrag als gelöstes AMO akzeptieren. – tatactic

+0

null nehmen Sie sich viel Zeit zu beantworten, also geben Sie bitte ein Feedback!Danke! – tatactic

1

@null ist richtig wie üblich, ich habe nur dieses Beispiel hinzugefügt, um die große Zahl zu realisieren. Sie können auch diese in einer Schleife initialisieren, so Sie können machen, was Sie wollen (als null Sie vorgeschlagen) ...

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:

Wenn Sie die gleichen Instanzen gespeichert werden sollen von Als Klasse empfehle ich Ihnen, die Vector-Klasse anstelle von Array zu verwenden.

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

Verwandte Themen