2016-11-13 73 views
0

我認爲這是與Eval相關的。AS3如何將一個數組的值賦給一個對象的Keys?

這裏,我有一個未知長度的數組在運行時。 說,例如,我想從數組作爲對象的按鍵分配值,如下:

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; 

我不知道如果我需要訴諸eval.hurlant,我希望有一個簡單的這樣做的方式(遞歸或某物)

+0

我不明白什麼是 「MyObj中[」 一 「] [」 B 「] [」 C「] [...] = 20「的意思。我從來沒有在AS3中看到過這種語法。也許這只是我,因爲我對AS3相當陌生,但那不是我見過的。我希望這會拋出各種各樣的錯誤。因爲你正在設置一個等於一個整數的對象。這可能是什麼意思?一個對象不能'='一個整數。或者你的意思是對象中有20個屬性?這很混亂 –

+0

也許你的意思是把它寫成像myObj = {「a」:String,「b」:String,「c」:String,...「t」:String};' –

+0

@NealDavis myObj是包含另一個對象(多層)的對象。 myObj [「a」]的值是一個Object,它包含關鍵字「b」和包含關鍵字「c」的另一個Object的值... 您可以將其視爲JSON格式: { 「一」:{ 「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和往常一樣正常,我只是添加了這個例子來實現大數字。 您也可以在一個循環中初始化這一點,所以你能夠讓你想要的東西(如空建議你)......

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:

如果你想存儲的同一實例一個類,我建議你使用Vector類來代替Array。

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

相關問題