Javascript 使用下划线扩展以避免覆盖嵌套对象?
我想将此对象修改为:Javascript 使用下划线扩展以避免覆盖嵌套对象?,javascript,underscore.js,Javascript,Underscore.js,我想将此对象修改为: var obj = { customerInfo: { fname: "Tom", lname: "Smith", age: 23, height: 160 }, car: { color: "red", numWheels: 4 } }; 然而,如果我这样做 var obj = { customerInfo: { fname: "Sally", lname: "Adams", m
var obj = {
customerInfo: {
fname: "Tom",
lname: "Smith",
age: 23,
height: 160
},
car: {
color: "red",
numWheels: 4
}
};
然而,如果我这样做
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"
}
});
而年龄和身高已被抹去
我需要做什么来保存嵌套的数据
更新更复杂的对象怎么样?
直接扩展
客户信息。下划线.extend()
将替换您提到的任何键,在本例中,将删除不在新对象中的任何以前的嵌套键
{
customerInfo: {
fname: "Sally",
lname: "Adams",
mname: "Tully"
},
car: {
color: "red",
numWheels: 4
}
};
有更好的方法来实现您实际上正在寻找的这种深度合并行为
您可以使用Jquery的$.extend API,如下所述:
我将这个小示例放在一起,以匹配您的代码示例,因为我相信您实际上正在寻找这种通用的合并方法,对吗
_.extend(obj.customerInfo, {
fname: "Sally",
lname: "Adams",
mname: "Tully"
});
但是,请注意JQuery文档
在深度扩展中,对象和数组被扩展,但基本类型(如String、Boolean和Number)上的对象包装器不被扩展。深入扩展循环数据结构将导致错误
对于不属于此行为的需求,请编写自定义扩展方法,或者使用类似lodash的库
查看lodash的合并API文档
希望这能帮助更多人…谢谢。我的例子有点太简单了。是否有更好、更快的方法来更新更复杂的对象,如我在这里的示例中所示?也加入了OP。
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);