2015-06-02 68 views
0
var obj = { 
    customerInfo: { 
    fname: "Tom", 
    lname: "Smith", 
    age: 23, 
    height: 160 
    }, 
    car: { 
    color: "red", 
    numWheels: 4 
    } 
}; 

我想修改這個對象爲:使用下劃線_.extend以避免覆蓋嵌套對象?

var obj = { 
    customerInfo: { 
    fname: "Sally", 
    lname: "Adams", 
    mname: "Tully", 
    age: 23, 
    height: 160 
    }, 
    car: { 
    color: "red", 
    numWheels: 4 
    } 
}; 

但是,如果我這樣做

_.extend(obj, { 
    customerInfo: { 
    fname: "Sally", 
    lname: "Adams", 
    mname: "Tully" 
    } 
}); 

的對象變成

{ 
    customerInfo: { 
    fname: "Sally", 
    lname: "Adams", 
    mname: "Tully" 
    }, 
    car: { 
    color: "red", 
    numWheels: 4 
    } 
}; 

年齡身高已被清除。

我需要做些什麼來保留嵌套的數據?

那麼更新更復雜的對象呢?

http://jsfiddle.net/j4L18p7k/2/#share

回答

1

有你實際上是在尋找...

你可以使用jQuery的$ .extend API實現這一深刻的合併行爲的更好的方法是記錄在這裏:http://api.jquery.com/jquery.extend/

我已經把這個小例子放在一起來匹配你的代碼示例,因爲我相信你這種通用的合併方法就是你真正想要的,對嗎?

var o = { 
    customerInfo: { 
    fname: "Tom", 
    lname: "Smith", 
    age: 23, 
    height: 160, 
    paymentMethods: { 
     paypal: { 
     username: "sally" 
     } 
    } 
    }, 
    car: { 
    color: "red", 
    numWheels: 4 
    } 
}; 

// this wipes out more deeply nested things (paypal disappears) 
var merge = $.extend(true, {} , o.customerInfo, { 
    "fname": "Sally", 
    lname: "Adams", 
    mname: "Tully", 
    paymentMethods: { 
     visa: { 
     lastFour: "5555" 
     } 
    } 
}); 

console.dir(merge); 

http://jsfiddle.net/hrqbyd5c/9/

但是要注意的JQuery文檔

在深擴展,對象和數組的擴展,但基本類型,如字符串,布爾值和數字對象包裝不是。深度擴展週期性數據結構將導致錯誤。

對於不屬於此行爲的需求,請改爲編寫自定義擴展方法,或者使用庫如lodash。

退房lodash的合併API文檔https://lodash.com/docs#merge

希望這有助於更多...

1

擴展customerInfo直接。下劃線.extend()會替換您提到的任何鍵,在這種情況下,將刪除不在新對象中的任何先前的嵌套鍵。

_.extend(obj.customerInfo, { 
    fname: "Sally", 
    lname: "Adams", 
    mname: "Tully" 
}); 
+0

感謝。我的例子太簡單了。有更好的更快的方法來更新更復雜的對象,比如我的例子嗎? http://jsfiddle.net/j4L18p7k/2/#share也添加到OP中。 – fuzzybabybunny