AS3 emite String como un objeto

Estoy tratando de convertir la siguiente cadena en un objeto considerando que existe el objeto en la cadena:

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

¿Cómo lograría esto? ¿Hay alguna alternativa a un método que pueda proporcionar?

preguntado el 14 de febrero de 14 a las 01:02

¿Quiso decir no incluir el "" comillas alrededor myObject.property1.property2? -

Las comillas están destinadas a estar allí. Estoy tratando de evaluar si al objeto creado dinámicamente le falta alguna de las propiedades encadenadas. -

Ahora veo lo que quieres decir: puedes lograrlo usando la recursividad. -

3 Respuestas

Puedes usar una función simple como esta:

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;
}

Con una prueba:

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

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

Respondido 14 Feb 14, 01:02

Gracias por compartir esto Marti! Esta es una buena manera de lograr esto también. - Kirill

¿Supongo que está tratando de crear dinámicamente un objeto a partir de una cadena ensamblada? Si es así, creo que lo que estás buscando es:

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

Esto supone que miObjetoEl alcance de es "este", y eso propiedad2 es un objeto también.

Respondido 14 Feb 14, 01:02

Buen ejemplo, pero para el objeto creado dinámicamente arrojará un error 1069 para la propiedad que no se encuentra en la clase de trabajo. - Kirill

Bueno, mientras exista property1 y property2, ese código estaría bien. La pregunta del OP es más clara después de sus comentarios. No me di cuenta de que el objetivo era confirmar la existencia de las propiedades. :) - costillas

   //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;
            }
        }
    }

Respondido 14 Feb 14, 03:02

En lugar de var propertyName:String = t[0]; debería ser var propertyName:String = t[i]; - Kirill

Sí, debería ser t[i]. - Pan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.