如何深度复制包含集合的JavaScript对象

时间:2017-03-17 16:57:17

标签: javascript jquery copy set

jQuery深拷贝使用
var objCopy = jQuery.extend(true, {}, obj);

适用于
var obj = {str: "text", num: 2, arr: [1, 2, 3]}

但是如何呢 var obj = {str: "text", num: 2, set: new Set([1,2,3])}

我发现对obj.set 进行更改也会更改objCopy.set
有没有办法深入到obj内的集合,并将其深层副本分配给objCopy

1 个答案:

答案 0 :(得分:0)

你可以实现一个小的copy函数,当有一个集合时会处理它。

function myCopy(obj) {
  obj = jQueryDeepCopierOfObject(obj); // Deep copy it here

  for (let prop in obj)
    if (obj.hasOwnProperty(prop))
      if (Set.prototype.isPrototypeOf(obj[prop]))
        obj[prop] = new Set(obj[prop]);

  // hoping there won't be any object in the set.
  return obj;
}

示例:

var a = { a: "foo",  b: "bar", 
          c: "baz",  set: new Set() };
          
a.set.add("fox");
a.set.add("bat");
a.set.add("wisdom");

var b = mycopy(a);

console.log("a === b: ", a === b); // → false
console.log("a.set === b.set: ",
             a.set === b.set);      // → false

b.set.add("kindness");

console.log("set a has kindness: ",
            a.set.has("kindness")); // → false
console.log("set b has kindness: ",
            b.set.has("kindness")); // → true

function mycopy(obj) {
  obj = Object.assign({}, obj);

  for (let prop in obj)
    if (obj.hasOwnProperty(prop))
      if (Set.prototype.isPrototypeOf(obj[prop]))
        obj[prop] = new Set(obj[prop]);

  return obj;
}