在AS3中组合/合并动态对象

时间:2010-11-16 15:54:01

标签: flex flash actionscript-3 dynamic object

我有2个动态对象,我想构建一个包含所有属性的对象:

var o1:Object = {prop1:val1,prop2:val2,prop3:val3};
var o2:Object = {prop3:val3a,prop4:val4};

我需要获得第三个看起来像这样的对象:

{prop1:val1, prop2:val2, prop3:val3a, prop4:val4};

基本上我需要一种迭代对象属性并向第三个对象添加新属性的方法。我不得不提到我对AS3 / Flash / Flex很新。

3 个答案:

答案 0 :(得分:3)

第一个问题,你真的想在这两个对象中使用prop3吗?你需要决定在碰撞的情况下该做什么,哪个对象优先。

其次,查看内省apis:http://livedocs.adobe.com/flex/3/html/help.html?content=usingas_8.html

这样的事情应该有效:

public function mergeDynamicObjects ( objectA:Object, objectB:Object ) : Object 
{
    var objectC:Object = new Object();

    var p:String;

    for (p in objectA) {
       objectC[p] = objectA[p];
    }

    for (p in objectB) {
       objectC[p] = objectB[p];
    }

    return objectC;
}

如果A和B中存在属性,B将覆盖A。另请注意,如果属性的值是对象,它将传递引用,而不是值的副本。在这些情况下,您可能需要克隆对象,具体取决于您的需求。

注意:我实际上没有测试过上面的内容,但它应该是关闭的。如果它不起作用,请告诉我。

已更新以修复错误。很高兴它适合你。

答案 1 :(得分:2)

您可以使用索引运算符动态访问/设置对象的属性。 for循环将遍历属性名称,因此如果将它们全部放在一起,则会通过以下测试:

    [Test]
    public function merge_objects():void {
        var o1:Object = {prop1:"one", prop2:"two", prop3:"three"}; 
        var o2:Object = {prop3:"threeA", prop4:"four"};

        var o3:Object = new Object();

        for (var prop in o1) o3[prop] = o1[prop];
        for (var prop in o2) o3[prop] = o2[prop];

        assertThat(o3.prop1, equalTo("one"));
        assertThat(o3.prop2, equalTo("two"));
        assertThat(o3.prop3, equalTo("threeA"));
        assertThat(o3.prop4, equalTo("four"));
    }

答案 2 :(得分:0)

您可以迭代对象属性,如:

var obj1:Object = new Object();
for(var str:String in obj2){
    obj1[str] = "any value"; // insert the property from obj2 to obj1
}