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