2016-11-13 29 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

相关问题