Объединение объектов в AS3 - PullRequest
3 голосов
/ 18 марта 2011

Я хочу объединить два объекта 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 ]

4 голосов
/ 18 марта 2011

метод слияния ниже

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

трассировки:

шрифт: obj0 Verdana obj1 undefined -> новое значение = Verdana

fontColour: obj0 16777215 obj116777215 -> новое значение = 16777215

baseColour: obj0 3158583 obj1 undefined -> новое значение = 3158583

анимация: obj0 false obj1 true -> новое значение = true

baseFontSize: obj0 14 obj1 10 -> новое значение = 10

важная строка:

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

рекурсивно создает свойство для нового объекта obj и проверяет,свойство присваивается второму объекту, если это так, оно присваивает значение второго объекта этому свойству, в противном случае оно возвращается к значению этого свойства в первом объекте.

Примечание: если значение не являетсяустановлен на первый объект, он не будет найден во втором объекте.

3 голосов
/ 18 марта 2011

Вы можете использовать что-то вроде этого:

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 голосов
/ 11 апреля 2012

Если вы хотите перезаписать существующие значения в первом объекте, вы можете просто сделать это:

for ( var p in _propsObj2 )
    _propsObj[p] = _propsObj2[p];
1 голос
/ 18 марта 2011

Ну, вот общая полезная функция, которая делает это:

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 Framework связывает настройки стиля.

1 голос
/ 18 марта 2011
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]]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...