2016-08-01 89 views
2

我有兩個JavaScript對象,它們共享幾個屬性。替換JavaScript對象的共享屬性

var object1 = {"prop1":"a", "prop2": "b", "prop3":"c"}; 
var object2 = {"prop2":"d", "prop4": "e", "prop5":"f"}; 
//replace shared properties here 
//maybe using object.hasOwnProperty??? 
return object1; 
//desired output: {"prop1":"a", "prop2": "d", "prop3":"c"}; 

我想用object1爲模板,以一組過濾器返回到我的用戶,然而,過濾器可能發生變化,這些變化將被保存到對象2。我正在嘗試更新object1中的屬性與對象2中的屬性,只要它們存在於兩個對象中。在此示例中,例如,我想採用默認值prop1prop3,使用object2的值prop2,並忽略prop4prop5。 我可以很容易地遍歷object1的屬性,並檢查他們是否在對象2,但我覺得必須有這樣做(類同union()intersection()

回答

2

像這樣的事情更簡單的方法?

var object1 = {"prop1":"a", "prop2": "b", "prop3":"c"} 
 
var object2 = {"prop2":"d", "prop4": "e", "prop5":"f"} 
 

 
function mergeCommon (a, b) { 
 
    return Object.keys(a).reduce((obj, prop) => { 
 
    if (prop in b) obj[prop] = b[prop] 
 
    return obj 
 
    }, a) 
 
} 
 

 
console.log(mergeCommon(object1, object2))

1

一種方式做到這一點是:

const object1 = {"prop1":"a", "prop2": "b", "prop3":"c"}; 
 
const object2 = {"prop2":"d", "prop4": "e", "prop5":"f"}; 
 
for (const key in object1) { 
 
    if (object1.hasOwnProperty(key) && object2.hasOwnProperty(key)) { 
 
    object1[key] = object2[key]; 
 
    } 
 
} 
 
console.log(object1);

+0

我的只需1秒 – Tyrsius

+0

@Tyrsius做得好擊敗你。我想你的答案也會被認爲更「現代」。 – mash

2

您可以通過迭代上的object1的按鍵,並使用值建立你的輸出它們存在時爲object2

var object1 = {"prop1":"a", "prop2": "b", "prop3":"c"}; 
 
var object2 = {"prop2":"d", "prop4": "e", "prop5":"f"}; 
 

 
var output = {}; 
 

 
Object.keys(object1).forEach(function(k) { 
 
    output[k] = (object2[k] === undefined ? object1 : object2)[k]; 
 
}); 
 

 
console.log(output);

+0

如果'object2.prop2'錯誤,它不會傳播到'object1.prop2'。 (嘗試'var object2 = {「prop2」:0,「prop4」:「e」,「prop5」:「f」};' –

+0

@RickHitchcock謝謝!這是固定的。 – Arnauld