我想下面的字符串转换要考虑字符串中的对象的对象存在:AS3投字符串作为对象
var exampleStr:String = "myObject.property1.property2";
var exampleObj:Object = exampleStr as Object;
我将如何做到这一点,是有一个替代您可以提供的方法?
我想下面的字符串转换要考虑字符串中的对象的对象存在:AS3投字符串作为对象
var exampleStr:String = "myObject.property1.property2";
var exampleObj:Object = exampleStr as Object;
我将如何做到这一点,是有一个替代您可以提供的方法?
您可以使用一个简单的函数是这样的:
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!
感谢分享这个马蒂!这也是实现这一目标的好方法。 – Rigganator
我认为你试图从组装的字符串动态创建一个对象?如果是这样,我想你在找什么是:
var exampleObj:Object = this[ "myObject.property1.property2" ];
这假定myObject的的范围是‘这个’,那property2是一个对象,以及。
很好的例子,但对于动态创建的对象,它将为在工作类中找不到的属性抛出错误1069。 – Rigganator
那么,只要property1和property2存在代码就没问题。 OP的问题在他的评论后更加明确。我没有意识到目标是确认房产的存在。 :) – Ribs
//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;
}
}
}
而不是'var propertyName:String = t [0];'它应该是'var propertyName:String = t [i];' – Rigganator
是的,它应该是t [i]。 – Pan
您的意思是不包括' “”'报价周围'myObject的痕迹。 property1.property2'? – Marty
引号是为了在那里。我试图评估动态创建的对象是否缺少任何链式属性。 – Rigganator
我明白你的意思 - 你可以用递归来实现。 – Marty