我想将两个A3对象合并在一起,其中包含一些相同的键,但值不同。我发现了许多关于将两个对象添加到一起的帖子,但我想将两个对象合并在一起,所以如果第二个对象具有不同的值,则它们优先。我有两个对象:
_propsObj = new Object();
_propsObj.baseColour = 0x303237;
_propsObj.animation = false;
_propsObj.font = "Verdana";
_propsObj.fontColour = 0xffffff;
_propsObj.baseFontSize = 14;
_propsObj2 = new Object();
_propsObj2.animation = true;
_propsObj2.fontColour = 0xffffff;
_propsObj2.baseFontSize = 10;
我想要的输出对象会接受第二个对象的新值,但保留第一个对象的值:
_outputObj.baseColour = 0x303237;
_outputObj.animation = true;
_outputObj.font = "Verdana";
_outputObj.fontColour = 0xffffff;
_outputObj.baseFontSize = 10;
我不确定我是否应该使用Arrray.concat执行此操作或是否有更简单的解决方案?任何帮助将不胜感激。
答案 0 :(得分:4)
下面的合并方法
var _propsObj:Object = new Object();
_propsObj.baseColour = 0x303237;
_propsObj.animation = false;
_propsObj.font = "Verdana";
_propsObj.fontColour = 0xffffff;
_propsObj.baseFontSize = 14;
var _propsObj2:Object = new Object();
_propsObj2.animation = true;
_propsObj2.fontColour = 0xffffff;
_propsObj2.baseFontSize = 10;
var merged:Object = merge( _propsObj, _propsObj2 );
private function merge( obj0:Object, obj1:Object ):Object
{
var obj:Object = { };
for( var p:String in obj0 )
{
obj[ p ] = ( obj1[ p ] != null ) ? obj1[ p ] : obj0[ p ];
trace( p, ' : obj0', obj0[ p ], 'obj1', obj1[ p ], '-> new value = ', obj[ p ] );
}
return obj;
}
迹线:
font:obj0 Verdana obj1 undefined - >新值= Verdana
fontColour:obj0 16777215 obj1 16777215 - >新值= 16777215
baseColour:obj0 3158583 obj1 undefined - >新值= 3158583
动画:obj0 false obj1 true - >新值=真
baseFontSize:obj0 14 obj1 10 - >新值= 10
重要的一点是:
obj[ p ] = ( obj1[ p ] != null ) ? obj1[ p ] : obj0[ p ];
它递归地在新的Object'obj'上创建属性,并检查是否在第二个对象上分配了该属性,如果是,则将第二个对象的值赋给该属性,否则它将回退到该属性的值第一个对象上的属性。
注意:如果未在第一个对象上设置值,则不会在第二个对象中查找该值。
答案 1 :(得分:3)
您可以使用以下内容:
private function merge(obj1:Object, obj2:Object):Object {
var result:Object = new Object();
for (var param:String in obj1) {
result[param] = (obj2[param] ? obj2[param] : obj1[param]);
}
return result;
}
用法:
_outputObj = merge(_propsObj, _propsObj2);
答案 2 :(得分:2)
如果要覆盖第一个对象中的现有值,可以这样做:
for ( var p in _propsObj2 )
_propsObj[p] = _propsObj2[p];
答案 3 :(得分:1)
var _propsObj:Object = new Object();
_propsObj.baseColour = 0x303237;
_propsObj.animation = false;
_propsObj.font = "Verdana";
_propsObj.fontColour = 0xffffff;
_propsObj.baseFontSize = 14;
var _propsObj2:Object = new Object();
_propsObj2.animation = true;
_propsObj2.fontColour = 0xffffff;
_propsObj2.baseFontSize = 10;
var mergedObj:Object = new Object();
//Adds the values from the first object
for (var r in _propsObj)
{
mergedObj[r] = _propsObj[r];
}
//Adds the values from the second object
for(var s in _propsObj2)
{
mergedObj[s] = _propsObj2[s];
}
//Checking the merged values
for(var t in mergedObj)
{
trace([t, mergedObj[t]]);
}
答案 4 :(得分:1)
嗯,这是一个通用的实用函数:
public static function zip(objects:Array):Object
{
var r:Object = {};
for each (var o:Object in objects)
for (var k:String in o)
r[k] = o[k];
return r;
}
用法示例:
var obj:Object = {
"foo": 1,
"bar": 2,
"baz": 3
};
var obj2:Object = {
"bar": 4,
"baz": 6
};
var obj3:Object = {
"foo": 3,
"bar": 6
};
var result:Object = zip([obj, obj2, obj3]);
for (var k:String in result)
trace("Property:", k, result[k]);
输出:
Property: foo 3
Property: baz 6
Property: bar 6
附注:这是一种“有损”方法,因为结果对象不知道各个属性的来源,只保留最新版本的值。如果你想保留这些信息,那么使用原型链就可以采用另一种方法。例如,Flex框架链式样式设置就是这样的。