精华内容
下载资源
问答
  • 对象深拷贝

    2017-10-31 21:41:12
    对象深拷贝方法 ,不改变原对象,使用JSON.stringify、JSON.parse方法 var arrTan=[1,2,3,4,5]; var arrZhou = JSON.parse(JSON.stringify(arrTan)); arrZhou[0]=55; console.log(arrTan) //[1, 2, 3, 4, 5]...

       对象深拷贝方法 ,不改变原对象,使用JSON.stringify、JSON.parse方法


    var arrTan=[1,2,3,4,5];
    var arrZhou = JSON.parse(JSON.stringify(arrTan));
    arrZhou[0]=55;
    console.log(arrTan)  //[1, 2, 3, 4, 5]



    var tanyan = {"name":"tanyan","age":24};
    var zhoulizhuo = JSON.parse(JSON.stringify(tanyan));
    zhoulizhuo.name = "zlz";
    console.log(tanyan.name)//tanyan



    展开全文
  • 写前端的时候经常会遇到对象的拷贝,一般我们...总结一下常用的对象深拷贝以及数组对象的深拷贝。1. 序列化转成json字符串深拷贝,以及存在的问题; 2. Object.assign()深拷贝,以及存在的问题; 3. 循环递归深拷贝。

    写前端的时候经常会遇到对象的拷贝,一般我们会用到深拷贝,深拷贝就是完完整整的将一个对象从内存中拷贝一份出来,放到另一块新开辟的内存中去。向下面这种赋值是浅拷贝,a、b都是对同一块内存进行引用,a、b哪一个变量修改对象的属性值都会相互影响。总结一下常用的对象深拷贝以及数组对象的深拷贝。

    var a = {id:"",name:""}
    var b = a;
    
    1. 序列化转成json字符串深拷贝,以及存在的问题
    2. Object.assign()深拷贝,以及存在的问题
    3. 循环递归深拷贝

    一、序列化转成json字符串深拷贝

    例:

    let source = {"id":1};
    //序列化转成json字符串
    let jsonStr = JSON.stringify(source)
    //反序列化为对象
    let target = JSON.parse(jsonStr);
    

    存在的问题:
    此方法仅在原对象包含可序列化值类型且没有任何循环引用时才有效。不可序列化值类型的一个例子是 Date 对象 - JSON.parse 只能将其解析为字符串而无法解析回其原始的 Date 对象

    注:
    同时总结java的序列化
    序列化:就是把一个java对象转成字节流
    反序列化:就是把字节流转成java对象
    当然序列化不仅仅可以是转成字节流或者json字符串,还有很多种方式
    为什么在java对象要序列化,什么场景要序列化?
    如果没有序列化,怎么把一个在内存里面的对象保存到文件里面去,怎么把内存的对象通过网络传输到另一台计算机的内存去呢?序列化就是把内存的对象转成字节流或者json字符串等方式进行传输用的,用在一些保存对象到文件、网络传输对象等io流传输对象的场景。


    二、Object.assign()深拷贝

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
    基本语法:Object.assign(target, …sources)
    例:

    var source = {"id":1,name:"lin"};
    var target = Object.assign({},source);
    

    这样就可以把source对象里面的相同属性值拷贝到target对象

    存在的问题:
    如果要拷贝的对象source里面的属性不是基础类型也是对象,或者属性含有对象数组,这种方式的拷贝就不会把source对象里面的对象或者数组对象进行深拷贝
    例:

    var source = {"id":1,list:[{"name":"小明"},{"name":"小花"}]};
    var target = Object.assign({},source);
    

    这时target里面的属性list数组对象只是浅拷贝source里面的list,还是对同一块内存的引用
    也可以向下面这样优化,循环list数组里面的对象进行Object.assign拷贝,添加到一个新的数组去,然后再赋值给target.list
    例:

    let source = {"id":1,list:[{"name":"小明"},{"name":"小花"}]};
    let target = Object.assign({},source);
    //对象数组的深拷贝
    let newlist = [];
    for(let i=0;i<target.list.length;i++){
          let obj = Object.assign({}, target.list[i]);
          newlist.push(obj);
    }
    target.list = newlist;
    

    注:如果对象里面还含有对象属性,而里面的对象属性又含有对象属性,则这种方式很麻烦不合适。

    三、循环递归深拷贝

    function deepClone(obj, newObj) {
        var newObj = newObj || {};
        for (let key in obj) {
            if (typeof obj[key] == 'object') {
                let isArray = Array.isArray(obj[key]);//判断是否数组
                newObj[key] = (isArray == true ? [] : {})
                deepClone(obj[key], newObj[key]);
            } else {
                newObj[key] = obj[key]
            }
        }
        return newObj;
    }
    
    

    参考:
    网友haogemr的js 深度拷贝的几种方法

    展开全文
  • C#对象深拷贝

    2019-09-28 14:30:32
    C#对象深拷贝 众所周知,c#中的对象存在值类型和引用类型之分,故而对象之间的赋值就存在浅拷贝和深拷贝的概念 网上的深拷贝方法也很多,但是要么写的无比复杂,要么有诸多限制 最终还是选择了反射的方法...

    C#对象深拷贝

     

     

    众所周知,c#中的对象存在值类型和引用类型之分,故而对象之间的赋值就存在浅拷贝和深拷贝的概念

    网上的深拷贝方法也很多,但是要么写的无比复杂,要么有诸多限制

    最终还是选择了反射的方法,虽然都说反射效率太低,但是它毕竟最常见最通用的方法

    复制代码
    public static T DeepCopy<T>(T obj)
            {
                //如果是字符串或值类型则直接返回
                if (obj==null||obj is string || obj.GetType().IsValueType) return obj;
    
                object retval = Activator.CreateInstance(obj.GetType());
                System.Reflection.FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                foreach (System.Reflection.FieldInfo field in fields)
                {
                    try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
                    catch { }
                }
                return (T)retval;
            }
    复制代码

     

     

     

     

     

    if (!hasdata.Any())
    {
    decimal Total = 0, T1000 = 0, T500 = 0, T100 = 0;
    string[] arrtmps = { "Total", "T1000", "T500", "T100" };

    if (Request["Total"].ToDecimal() != 0 || Request["T1000"].ToDecimal() != 0 || Request["T500"].ToDecimal() != 0 || Request["T100"].ToDecimal() != 0)
    {
    foreach (var item in arrtmps)
    {
    Decimal tpdec = Request[item].ToDecimal();
    if (tpdec != 0)
    {
    var colltmp = DeepCopy<ClrMoneyBalance>(collection);
    colltmp.UseMoney = tpdec;
    colltmp.BalanceMoney = tpdec;
    colltmp.Denom = item == "Total" ? -1 : item == "T1000" ? 1000 : item == "T500" ? 500 : 100;
    _iClrMoneyBalanceService.Save(id, colltmp);
    }
    }
    _unitOfWork.Commit();
    return RedirectToAction("Index");
    }
    else
    {
    SetDefault(id, collection);
    ModelState.AddModelError("Denom", "Total 1000 500 100 field is required. ");
    return View(collection);

    }
    }

     

     

     

     //Id 排除

    public T DeepCopy<T>(T obj)
    {
    //如果是字符串或值类型则直接返回
    if (obj == null || obj is string || obj.GetType().IsValueType) return obj;

    object retval = Activator.CreateInstance(obj.GetType());
    System.Reflection.PropertyInfo[] fields = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    PropertyInfo pid = obj.GetType().GetProperty("Id");
    foreach (System.Reflection.PropertyInfo field in fields)
    {
    if (field != pid)
    {
    try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
    catch { }
    }

    }
    return (T)retval;
    }

     

     

    转载于:https://www.cnblogs.com/cjm123/p/10320135.html

    展开全文
  • 深拷贝和浅拷贝定义深拷贝:浅拷贝:通过JSON对象的方法实现深拷贝自定义基本数据类型和数组对象深拷贝函数 定义 深拷贝: 目标对象=源对象=>只存储源对象的数据内容,源对象内容改变不会影响目标对象内容。 浅...

    定义

    深拷贝:

    目标对象=源对象=>只存储源对象的数据内容,源对象内容改变不会影响目标对象内容。

    浅拷贝:

    目标对象=源对象=>只存储源对象的数据地址,源对象内容改变影响目标对象内容。

    通过JSON对象的方法实现深拷贝

    let obj1 ={
    	name:klz,
    	age:22
    }
    let str=JSON.stringify(obj1);
    let obj2=JSON.parse(str);
    

    自定义基本数据类型和数组对象深拷贝函数

    //检查数据类型函数
    let checkType = data =>{
        console.log(data);
        console.log(Object.prototype.toString.call(data).slice(8,-1));
    	return Object.prototype.toString.call(data).slice(8,-1);
    }
    //深拷贝函数
    let deepClone=target=>{
    	let targetType=checkType(target);
    	let result;
    	if(targetType==="Object"){
    		result={};
    	}else if(targetType==="Array"){
    		result=[];
    	}else{
            result=target;
            return result;
    	}
    	for(let i in target){
            value=target[i];
    		let valueType=checkType(value);
    		if(valueType==="Object"||"Array"){
    			result[i]=deepClone(value);
    		}else{
    			result[i]=value;
    		}
    	}
    	return result;
    }
    //测试
    let arr1=[1,2,[3,4]];
    let arr2=deepClone(arr1);
    arr1=5;
    console.log(arr1);//5
    console.log(arr2);//[1,2,[3,4]]
    
    展开全文
  • JavaScript对象深拷贝

    2019-10-07 11:44:57
    JavaScript对象深拷贝 引言 在JavaScript中对对象拷贝复制通常是使用循环遍历的方式: var obj = { x:1, y:[1,2,3] } var obj2 = {}; for(let key in obj){ obj2[key] = obj[key]; } 虽然obj2和obj输出的结果看...
  • Map拷贝 关于对象深拷贝 浅拷贝的问题 概念 浅复制:则是只复制对象的引用,两个引用仍然指向同一个对象,在内存中占用同一块内存。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然...
  • js 日期对象深拷贝

    千次阅读 2019-04-25 22:08:16
    更详细的对象深拷贝方法请参考:https://blog.csdn.net/liwusen/article/details/78759373写的很详细 因为valueOf方法,日期类定义的valueOf()方法会返回它的一个内部表示:1970年1月1日以来的毫秒数.因此我们可以...
  • Vue数组对象深拷贝

    千次阅读 2018-04-19 16:59:36
    Vue数组对象深拷贝 导语: 1.一个数组A,A中有多个对象,将A复制为B,即B=A,此时如果对A中的对象值修改,B会跟随同时更改。 2.如果在Vue里不想这种双向绑定,选择深拷贝。 3.深拷贝的思想是用Object....
  • 深拷贝和浅拷贝的区别,则在于java对象中的基本数据属性和引用数据类型属性。浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。深拷贝:对基本数据类型进行值传递,对引...
  • 所谓深拷贝就是将源对象克隆了一份保存在内存中,后续对复制的对象所有操作都不会影响源对象。 因为Map的putAll()的拷贝方式实现的是浅拷贝,所以后续对复制对象操作会影响到源对象。 在java中,对象的赋值都是对象...
  • 详解JavaScript对象深拷贝

    千次阅读 2019-04-04 13:09:25
    详解JavaScript对象深拷贝 在几乎所有编程语言中,对象都以引用形式保存给变量、复制给其他变量。JavaScript语言也是如此。因此简单的进行赋值操作进行复制仅仅是对对象数据的引用地址进行一个传递,并不会将对象...
  • JAVA对象拷贝分为两种方式,一种是引用拷贝,一种是对象拷贝 引用拷贝:和对象拷贝的不同之处在于,引用拷贝只会生成一个新的对象引用地址,但两个地址其最终指向的还是同一个对象对象拷贝:这种方式会重新生成...
  • es6 对象深拷贝和浅拷贝

    万次阅读 2018-10-24 09:42:21
    简介:在项目中,为了不影响原有数据,在操作数据时,经常需要深拷贝一个对象,在开发过程中,实践得出。 Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 ...
  • Java对象深拷贝

    2015-12-22 17:52:08
    到网上搜索“Java对象深拷贝”,大多的实现方式是:clone函数实现、序列化+流读写实现新对象创建。 而今天同事想到了一个很简单地方法,采用第三方库gson来实现,太聪明了~ Gson gson = new Gson(); ...
  • JavaScript:利用递归实现对象深拷贝 先来普及一下深拷贝和浅拷贝的区别 浅拷贝:就是简单的复制,用等号即可完成 let a = {a: 1} let b = a 这就完成了一个浅拷贝 但是当修改对象b的时候,我们发现对象a的值也被...
  • js对象深拷贝

    千次阅读 2018-06-23 14:02:53
    对于深拷贝和浅拷贝,简单一句话带过,首先,基本数据类型(比如:Number、String、Boolean)不会出现浅拷贝和深拷贝的浅拷贝概念,对象会出现深拷贝和浅拷贝。假如A对象拷贝后是B对象,B对象中属性值的更改,A对象...
  • vue功能:数组、对象深拷贝 // 数组深拷贝 var array=[1,2,453,12,432] var newArray=JSON.parse(JSON.stringify(vs)) newArray.push(0) console.log(array) //此时array值不会变化,两个值是独立存在的 **********...
  • 深拷贝和浅拷贝说起深拷贝和浅拷贝,首先我们来看两个栗子// 栗子1var a = 1,b=a;console.log(a);console.log(b)b = 2;console.log(a);console.log(b)// 栗子2var obj1 = {x: 1, y: 2}, obj2 = obj1;console.log(obj...
  • function checktype(obj){ //检查对象类型 return Object.prototype....function depCopy(target,hash=new WeakMap()){ //hash 作为一个检查器,避免对象深拷贝中出现环引用,导致爆栈。 let type = checktype(...
  • 关于vue中JSON.parse(JSON.stringify(...))使用深拷贝问题一般我们单独用JSON.parse()或JSON.stringify()今天在学vue看到JSON.parse(JSON.stringify(...))的用法,这里研究一下;首先分别说下他们的用法:JSON.parse...
  • 深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述: 了解了浅拷贝和深拷贝的区别之后,本篇博客将教大家几种深拷贝的方法。 拷贝对象 首先,我们定义一下需要...
  • C#对象深拷贝方法

    千次阅读 2012-07-03 11:30:59
    对象的拷贝是编程中常用到的,下面提供一个对象深拷贝的方法,挺不错的 public object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType(); //值类型 if (ta
  • Java中分为深拷贝和浅拷贝; BeanA 对象如下: public class BeanA { private String str1, str2; private List<BeanB> beanBList; } 如需浅拷贝,则需实现Serializable 接口,并重写 clone 方法,...
  • 然而我们知道,我们经常用的赋值方式 “=” 实际上属于数据的浅拷贝,也就是当你改变赋值变量时,原数据也会发生相应变化。var a = ['1', '2', '3', '4', '5'];var b = a;b[0] = '2';console.log(a); // ['2', '2',...
  • React Native中的对象深拷贝

    千次阅读 2016-09-05 22:25:09
    React-Native中包含了许多类库,因此可以引用这些工具类库来简化开发过程。例如,lodash中提供了对象深拷贝的方法,我们就可以直接在自己编写的react native 模块中导入lodash模块,并使用这些封装好的方法。
  • 关于iOS的深拷贝,浅拷贝已经有很多文章,不必在过多赘述。有关系统常见可变对象和不可变对象的copy 和 mutableCopy网上有很多文章,一张图基本上可以说明那么本文着重要研究的是自定义对象的拷贝问题,特别比如说...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,164
精华内容 5,665
关键字:

对象深拷贝