使用下划线_.extend来避免覆盖嵌套对象?

时间:2015-06-02 17:14:33

标签: 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",
    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

2 个答案:

答案 0 :(得分:1)

直接扩展customerInfo。下划线.extend()替换您提到的任何键,在这种情况下,删除任何以前不在新对象中的嵌套键。

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

答案 1 :(得分:1)

有更好的方法来实现您实际上正在寻找的深度合并行为......

您可以使用Jquery的$ .extend API,如下所示:http://api.jquery.com/jquery.extend/

我已经将这个小例子放在一起以匹配您的代码示例,因为我相信这种通用的合并方法是您实际需要的,对吗?

uri

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

但要注意JQuery文档

  

在深度扩展中,对象和数组是扩展的,但对于原始类型(如String,Boolean和Number)的对象包装不是。深度扩展循环数据结构将导致错误。

     

对于不属于此行为的需求,请编写自定义扩展方法,或使用类似lodash的库。

查看lodash的合并API文档https://lodash.com/docs#merge

希望这有助于更多......