2014-02-14 109 views
0

我想下面的字符串转换要考虑字符串中的对象的对象存在:AS3投字符串作为对象

var exampleStr:String = "myObject.property1.property2";
var exampleObj:Object = exampleStr as Object;

我将如何做到这一点,是有一个替代您可以提供的方法?

+0

您的意思是不包括' “”'报价周围'myObject的痕迹。 property1.property2'? – Marty

+0

引号是为了在那里。我试图评估动态创建的对象是否缺少任何链式属性。 – Rigganator

+0

我明白你的意思 - 你可以用递归来实现。 – Marty

回答

1

您可以使用一个简单的函数是这样的:

function getRValue(target:Object, chain:String):* 
{ 
    for each(var i:String in chain.split(".")) 
    { 
     if(target.hasOwnProperty(i)) target = target[i]; 
     else 
     { 
      // Couldn't find property. 
      throw new Error("Property " + i + " does not exist."); 
     } 
    } 


    return target; 
} 

与测试:

var myObject:Object = { 
    property1: { 
     property2: "Hello world!" 
    } 
}; 

trace(getRValue(this, "myObject.property1.property2")); // Hello world! 
trace(getRValue(myObject, "property1.property2")); // Hello world! 
+0

感谢分享这个马蒂!这也是实现这一目标的好方法。 – Rigganator

1

我认为你试图从组装的字符串动态创建一个对象?如果是这样,我想你在找什么是:

var exampleObj:Object = this[ "myObject.property1.property2" ]; 

这假定myObject的的范围是‘这个’,那property2是一个对象,以及。

+0

很好的例子,但对于动态创建的对象,它将为在工作类中找不到的属性抛出错误1069。 – Rigganator

+0

那么,只要property1和property2存在代码就没问题。 OP的问题在他的评论后更加明确。我没有意识到目标是确认房产的存在。 :) – Ribs

1
//Convert the string to a property array  
    var t:Array = exampleStr.split("."); 

    var exampleObj:Object = null; 

    if (t.length > 0) 
    { 

     var objName:String = t[i]; 

     //get the object in the class 
     exampleObj = this[objName]; 

     for (var i:int = 1; i < t.length; i++) 
     { 
      var propertyName:String = t[i]; 

      if (exampleObj.hasOwnProperty(propertyName)) 
      { 
       exampleObj = exampleObj[propertyName]; 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
+1

而不是'var propertyName:String = t [0];'它应该是'var propertyName:String = t [i];' – Rigganator

+0

是的,它应该是t [i]。 – Pan