我有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很新。
答案 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
}