Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JSON的javascript深度复制_Javascript_Json_Deep Copy - Fatal编程技术网

使用JSON的javascript深度复制

使用JSON的javascript深度复制,javascript,json,deep-copy,Javascript,Json,Deep Copy,我对javascript对象(数组)深度复制有问题。我读了很多处理这件事的好方法。我还知道jQuery有$扩展API来解决这个问题。但我的问题是:我能用JSON字符串化和解析方法来解决这个问题吗 这是我的密码: function deepCopy(oldValue) { var newValue strValue = JSON.stringify(oldValue) return newValue = JSON.parse(strValue) } var a = { b: '

我对javascript对象(数组)深度复制有问题。我读了很多处理这件事的好方法。我还知道jQuery有$扩展API来解决这个问题。但我的问题是:我能用JSON字符串化和解析方法来解决这个问题吗

这是我的密码:

function deepCopy(oldValue) { 
  var newValue
  strValue = JSON.stringify(oldValue)
  return newValue = JSON.parse(strValue)
}

var a = {
  b: 'b',
  c: [1,2,4],
  d: null
}

copy = deepCopy(a)

console.log(a === copy) // false
console.log(a.c === copy.c) // false
PS:我知道如果没有,所有对象都是可序列化的,但我知道的唯一情况是,当对象包含一个属性时,它是函数。还有其他情况吗?

如果您的对象是“小”的,并且包含专门可序列化的属性,那么使用JSON序列化的简单deepCopy黑客应该可以。但是,如果对象很大,可能会遇到问题。如果它包含不可序列化的属性,那么这些属性将丢失:

var o = {
 a: 1,
 b: 2,
 sum: function() { return a + b; }
};

var o2 = JSON.parse(JSON.stringify(o));
console.log(o2);
收益率:

Object {a: 1, b: 2}
有趣的是,C#中相当多的深度复制解决方案都是类似的序列化/反序列化技巧

附录:不确定在复制后比较对象时希望得到什么。但是,对于复杂对象,通常需要编写自己的
Compare()
和/或
Equals()
方法来进行精确比较

同样值得注意的是,这种副本并不保留类型信息

JSON.parse(JSON.stringify(new A())) instanceof A === false

您可以这样做,但由于上面列出的一些原因,这是有问题的:

  • 我对表演表示怀疑

  • 您有任何不可序列化的属性吗

  • 最大的问题是:您的克隆缺少类型信息。取决于你在做什么,这可能是非常重要的。实现者是否向原始对象的原型中添加了方法?那些都不见了。我不确定你还会失去什么


  • 我想你要找的是这样的东西: 如果您有一个真正的嵌套对象结构,那么要进行深度复制,可以使用JSON.stringify()

    请参见以下示例:

    var obj= {
          'a':1,
          'b':2,
          'c': {
            'd':{
              'e' : 3
            }
          }
        }
    
    
    var newObj = {...obj};
    var lastObj = JSON.parse(JSON.stringify(obj));
    obj.c.d.e =19;
    console.log('obj '+obj.c.d.e);
    console.log('newObj '+obj.c.d.e);
    console.log('lastObj'+lastObj.c.d.e); 
    
    现在lastObj确实与obj分离,而如果使用…(扩散)操作符,它也不适用于真正复杂的对象


    希望这有帮助

    并非所有对象都可以序列化为JSON。即使是这样,将它们转换为字符串然后解析字符串似乎也是无效的。但它应该可以正常工作。唯一的问题是旧版本的IE,你需要一个polyfill。检查这里谢谢!我只知道如果一个对象包含一个函数属性,那么它是不可序列化的。但如果在其他情况下,对象是不可序列化的?另一方面,使用JSON深度复制对象与正常方式相比是否真的效率低下?您的深度复制工作正常。并且正在按它应该的方式工作。一切都很好!这是在Chrome的控制台中快速调试的一个很好的解决方案,因为Chrome将始终显示对象的最终状态,而不是调用console.log函数时的状态。