Nodejs: how to clone an object

后端 未结 12 2076
情书的邮戳
情书的邮戳 2020-12-04 18:32

If I clone an array, I use cloneArr = arr.slice()

I want to know how to clone an object in nodejs.

12条回答
  •  囚心锁ツ
    2020-12-04 19:15

    I implemented a full deep copy. I believe its the best pick for a generic clone method, but it does not handle cyclical references.

    Usage example:

    parent = {'prop_chain':3}
    obj = Object.create(parent)
    obj.a=0; obj.b=1; obj.c=2;
    
    obj2 = copy(obj)
    
    console.log(obj, obj.prop_chain)
    // '{'a':0, 'b':1, 'c':2} 3
    console.log(obj2, obj2.prop_chain)
    // '{'a':0, 'b':1, 'c':2} 3
    
    parent.prop_chain=4
    obj2.a = 15
    
    console.log(obj, obj.prop_chain)
    // '{'a':0, 'b':1, 'c':2} 4
    console.log(obj2, obj2.prop_chain)
    // '{'a':15, 'b':1, 'c':2} 4
    

    The code itself:

    This code copies objects with their prototypes, it also copy functions (might be useful for someone).

    function copy(obj) {
      // (F.prototype will hold the object prototype chain)
      function F() {}
      var newObj;
    
      if(typeof obj.clone === 'function')
        return obj.clone()
    
      // To copy something that is not an object, just return it:
      if(typeof obj !== 'object' && typeof obj !== 'function' || obj == null)
        return obj;
    
      if(typeof obj === 'object') {    
        // Copy the prototype:
        newObj = {}
        var proto = Object.getPrototypeOf(obj)
        Object.setPrototypeOf(newObj, proto)
      } else {
        // If the object is a function the function evaluate it:
        var aux
        newObj = eval('aux='+obj.toString())
        // And copy the prototype:
        newObj.prototype = obj.prototype
      }
    
      // Copy the object normal properties with a deep copy:
      for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
          if(typeof obj[i] !== 'object')
            newObj[i] = obj[i]
          else
            newObj[i] = copy(obj[i])
        }
      }
    
      return newObj;
    }
    

    With this copy I can't find any difference between the original and the copied one except if the original used closures on its construction, so i think its a good implementation.

    I hope it helps

提交回复
热议问题