2011-03-18 77 views
3

我想將兩個A3對象合併在一起,其中包含一些相同的Keys但不同的值。我發現很多關於添加兩個對象的帖子,但我想將兩個對象合併在一起,所以如果第二個對象具有不同的值,他們會優先考慮。下面我有兩個對象:合併AS3中的對象

_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做到這一點,或者如果有更簡單的解決方案?任何幫助,將不勝感激。

回答

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

痕跡:

字體:obj0宋體OBJ1未定義 - >新值=宋體

fontColour:obj0 16777215 OBJ1 16777215 - >新值= 16777215

baseColour:obj0 3158583 obj1 undefined - > new value = 3158583

動畫:obj0假OBJ1真 - >新值=真

baseFontSize:obj0 14 OBJ1 10 - >新值= 10

重要路線是:

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

它會遞歸地在新的Object'obj'上創建屬性,並檢查該屬性是否分配給第二個對象,如果是,則將第二個對象的值分配給該屬性,否則將回退到該屬性的值冷杉t對象。

注意:如果沒有在第一個對象上設置一個值,它將不會在第二個對象中查找。

+0

完美!感謝你! – redHouse71 2011-03-18 11:42:34

+0

那是什麼也@bmleite sugeested在更緊湊的方式:) – nicoptere 2011-03-18 12:19:31

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

嗯,我明白的意圖,只會考慮鍵從第一對象... – Veehmot 2012-10-04 04:58:21

+0

@Veehmot至於是合併只是「不同的值」,而不是新的屬性。要做一個「完整」合併,將下面一行'var result:Object = new Object();'改成'var result:Object = ObjectUtil.copy(obj2);'。這不是最佳的,但適用於大多數情況。 – bmleite 2012-10-17 18:02:02

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]]); 
} 
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框架如何鏈接樣式設置。

+0

非常感謝! – redHouse71 2011-03-18 15:42:56

2

如果你想覆蓋的第一個對象中現有的值,你可能只是這樣做:

for (var p in _propsObj2) 
    _propsObj[p] = _propsObj2[p];