合并AS3中的对象

时间:2011-03-18 10:50:50

标签: flash actionscript-3 object merge

我想将两个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执行此操作或是否有更简单的解决方案?任何帮助将不胜感激。

5 个答案:

答案 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框架链式样式设置就是这样的。