zoukankan      html  css  js  c++  java
  • 一行代码完成js对象数组的深拷贝

    1、对于普通数组(数组元素为数字或者字符串),深拷贝很简单,拷贝之后两个数组指针指向的存储地址不同,从而完成深拷贝

    var _test = [1,2,3];//原数组
    var _testCopy = [].concat(_test);//拷贝数组
    _testCopy[0]=4;
    console.log(_test);// [1,2,3]
    console.log(_testCopy);//[4,2,3]

    2、对于对象数组

    //形如
    var _objArr=[{"name":''weifeng"},{"name":"boy"}]

    如果还是利用上述的[].concat()方法拷贝数组,则获取的结果仍然是浅拷贝,改变其一,统统改变,例子:

    var _test = [{"name":"weifeng"},{"name":"boy"}];//原数组
    var _testCopy = [].concat(_test);//拷贝数组
    _testCopy[1].name="girl";
    console.log(_test);// [{"name":"weifeng"},{"name":"girl"}]
    console.log(_testCopy);//[{"name":"weifeng"},{"name":"girl"}]

    从例子上可以看出,这种对于对象数组的拷贝,由于数组内部属性值为引用对象,因此整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址,
    那么,如何完成此类数组的深拷贝,根据普通数组的深拷贝得到启发,我拷贝一个字符串,不拷贝引用对象,拷贝字符串会新辟一个存储地址,这样就切断了引用对象的指针联系,因此,得到的方法为:

    var _test = [{"name":"weifeng"},{"name":"boy"}];//原数组
    var _testCopy = [].concat(JSON.parse(JSON.stringify(_test)));//拷贝数组,注意这行的拷贝方法
    _testCopy[1].name="girl";
    console.log(_test);// [{"name":"weifeng"},{"name":"boy"}]
    console.log(_testCopy);//[{"name":"weifeng"},{"name":"girl"}]

    至此,大功告成,一行代码完成对象数组的深拷贝!

    此文章为转载,传送门:https://blog.csdn.net/xiongqiangwin1314/article/details/53184638

  • 相关阅读:
    linux笔记八---------文件查找
    linux笔记七---------管道
    linux笔记六-------文件权限设置
    linux笔记五-------编辑器
    linux笔记四-------用户和组的管理
    linux笔记三-------根目录相关说明
    linux笔记二-----目录及文件命令
    linux笔记一
    thinkphp框架验证码验证一次
    MarkDown 中使用 LaTeX 数学式
  • 原文地址:https://www.cnblogs.com/longxx/p/9376405.html
Copyright © 2011-2022 走看看