Merging Objects in AS3

I want to combine two A3 objects together containing the same keys but different values. I found a lot of posts about adding two objects together, but I want to combine the two objects together, so if the second object has different values, they take precedence. I have two objects below:

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

My desired object will accept the new values ​​of the second object, but it saves the values ​​of the first object:

    _outputObj.baseColour = 0x303237;
    _outputObj.animation = true;
    _outputObj.font = "Verdana";
    _outputObj.fontColour = 0xffffff;
    _outputObj.baseFontSize = 10;   

I was not sure if I should use Arrray.concat for this or if there is an easier solution? Any help would be appreciated.

+3
source share
5 answers

merge method

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

footprints:

font: obj0 Verdana obj1 undefined → new value = Verdana

fontColour: obj0 16777215 obj1 16777215 → new value = 16777215

baseColour: obj0 3158583 obj1 undefined → value = 3158583

: obj0 false obj1 true → new value = true

baseFontSize: obj0 14 obj1 10 → value = 10

:

obj[ p ] = ( obj1[ p ] != null ) ? obj1[ p ] : obj0[ p ];

'obj' , , , .

NB: , .

+4

- :

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);
+3

, :

for ( var p in _propsObj2 )
    _propsObj[p] = _propsObj2[p];
+2
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]]);
}
+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

Side note. This is a lossy method because the resulting object does not know where the individual properties came from and only stores the latest version of the value. If you want to keep this information, then there is another way to do this using the prototype chain. These are, for example, how, for example, Flex frame style settings.

+1
source

All Articles