2014-01-21 106 views
0

快速的問題的相反的效果 - 假設我們有兩個目標:

var obj={str:'',int:0,bool:false,arr:[]}; 
var paramObj={str:'Hey',bool:true}; 

jQuery中的.extend()函數的工作原理是這樣的:(我知識)

$.extend(obj,paramObj); 
// obj={str:'Hey',int:0,bool:true,arr:[]}; 

但我想要的東西,是這樣的,但在相反的,像這樣:

$.extendRev(paramObj,obj); 
// paramObj={str:'Hey',int:0,bool:true,arr:[]}; 

有一個有趣的在jQuery(或本地)語言中,它將兩個對象合併在一起,將對象值保留在第一個對象中,如果它們不存在於第一個對象中,則僅添加來自第二個對象的對象值。

還是我將不得不從頭開始編寫了這一點?

+2

因爲那時在值'obj'覆蓋在'paramObj'的價值觀,這是不是我想要的。 – Jimmery

+0

不明白爲什麼我會得到downvotes?這不是一個合法的問題嗎? – Jimmery

+0

那麼你在這裏期待什麼輸出。我想你會因爲你的問題解釋得很差而陷入低谷。 –

回答

2

只是爲了顯示你的香草JS會是什麼樣子,這將合併ba

function extendObject(a, b) { 
    if (a && b) { 
    for (var key in b) { 
     if (!a.hasOwnProperty(key)) a[key] = b[key]; 
    } 
    } 
}; 

Demo

9

你可以簡單地用一個空對象爲出發點:

$.extend({},obj,paramObj); 

Chrome的控制檯顯示的結果是

Object {str: "Hey", bool: true, int: 0, arr: Array[0]} 
0

擴展功能也合併多個對象..

var obj={str:'',int:0,bool:false,arr:[]}; 
var paramObj={str:'Hey',bool:true}; 
var p= {} 
$.extend(p,obj, paramObj); 
如果你想使用普通的JavaScript,你可以做這樣的事情
1

var a = {str:'Hey',bool:true}; 
var b = {str:'',int:0,bool:false,arr:[1,2,3]}; 

function x_extend(obj1, obj2){ 
    for(prop in obj2){ 
     if (obj1.hasOwnProperty(prop) === false){ 
      obj1[prop] = obj2[prop]; 
     } 
    } 
} 

x_extend(a, b); 

console.log(a); 
0

這經常發生,當你需要通過遍歷積累設置設置提供者的層次結構從葉子到根。以下是我的操作方法:

while(provider) { 

    $.extend(accumulator, $.extend({},provider.defaults,accumulator)); // <--- 
    provider = provider.parent; 
} 

inner extend將創建一個單獨的,正確合併的對象。然後外部延伸將屬性複製到累加器上。