• 克隆数组


    一、浅表克隆

      1、通过调用oldArr.concat();或oldArr.slice();

      2、在浅表副本中,如果原始数组的元素时复杂类型,则元素值指向对象的引用而非对象本身,与原始数组的一样,浅表副本的元素值也指向对象的引用,对对象所做的任何更改都

      会影响指向对象(在两个数组中反映出来)

      

    二、深度克隆

      1、在深度克隆副本中,不断复制索引,还将复制原始数组中的所有对象,从而使新数组和原数组指向不同的对象

      2、深度克隆代码实现如下:

    /**
     * 
     * @authors  Soul (2461358597@qq.com)
     * @date     2016-05-22 18:15:28
     * @version  0.0.1
     * @description  clone a Array as deep or shallow.
     *
     */
    
    /**
    *
    * @param  oldArr  将被克隆的数组
    * @param  deep  是否深度克隆(value=true/false),默认为false
    * @param  newArr  返回克隆的新数组
    * @return Array  返回克隆的新数组
    *
    */
    
    function clone(oldArr,deep){
    
        //判断是否进行深度克隆
        var isDeep,newArr=[];
        if(arguments.length==1){
            isDeep=false;
        }
        if(arguments.length==2){
            isDeep=deep;
        }else{
            throw new Error("参数不正确");
            return;
        }
    
        //克隆  start
        if(isDeep){
    
            //深度克隆oldArr====>newArr
    
            for(var i in oldArr){
                var prop=oldArr[i];
                //oldArr元素是对象
                if(typeof prop=="object"){
                    //该元素是数组对象
                    if(prop instanceof Array){
                        // newArr[i]=[];
                        for(var j=0;j<prop.length;j++){
                            if(typeof prop[j]!='object'){
                                newArr[i].push(prop[i]);
                            }else{
                                newArr[i]=clone(prop,true);
                            }
                        }
                    }else{//该元素是非数组对象
                        //创建新对象  指向新的引用
                        var newProp={};
                        for(var attr in prop){
                            eval("newProp."+attr+"="+"'"+prop[attr]+"'");
                        }
                        newArr[i]=newProp;
                    }
                }else{//oldArr元素不是对象
                    newArr[i]=prop;
                }
            }
        }else{
            //浅度克隆oldArr===>newArr
            newArr=oldArr.concat();
        }
        //克隆  end
    
        return newArr;
    }

      3、测试如下:

        

    All rights reserved please indicate the source if reprint---吓尿了的大肥鼠
  • 相关阅读:
    linux_java_同时启动三个项目脚本
    Python 项目-飞机大战_02.飞机大战-2
    Python 项目-飞机大战_01.飞机大战-1
    Mysql为什么要使用视图?
    Python语法基础_10.加强练习
    Python语法基础_09.面向对象3、异常、模块
    crontab--设置周期性被执行的指令
    面试者应向公司问什么问题?
    简单的触发黑名单阻断演示 control+c
    SetConsoleCtrlHandler演示
  • 原文地址:https://www.cnblogs.com/realsoul/p/5517050.html
Copyright © 2020-2023  润新知