克隆数组

一、浅表克隆

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

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

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

  

二、深度克隆

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

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

/**
 *
 * @authors  Soul ([email protected])
 * @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、测试如下:

    

时间: 2025-01-05 23:31:32

克隆数组的相关文章

数组常用的几种方法

push:向数组的末尾增加一项 返回值是数组的新长度unshift:向数组开头增加一项 返回值是数组的新长度pop:删除数组的末尾项 返回值是删除的数组项shift:删除数组开头项 返回被删除的开头项目splice:删除数组中的任意项 返回值是被删除的数组项slice:复制数组 返回值是复制到的新数组 写上数值之后 不包含被复制的最后一项 拼接:concat:把一个数组和另一个数组拼接在一起 返回拼接好的数组 join:把数组中的每一项 按照指定的分隔符拼接成字符串 排序:reverse:倒序数

数组常用的方法和返回值

push:向数组的末尾增加一项 返回值是数组的新长度unshift:向数组开头增加一项 返回值是数组的新长度pop:删除数组的末尾项 返回值是删除的数组项shift:删除数组开头项 返回被删除的开头项目splice:删除数组中的任意项 返回值是被删除的数组项slice:复制数组 返回值是复制到的新数组 写上数值之后 不包含被复制的最后一项 拼接:concat:把一个数组和另一个数组拼接在一起 返回拼接好的数组 join:把数组中的每一项 按照指定的分隔符拼接成字符串 排序:reverse:倒序数

数组方法知多少?

一.什么是数组? 数组是用来保存多条数据,和其他语言的数组不一样,js中的数组可以保存任何类型的数据: 如:var ary=[]; var ary=[1,2,3,4,5,6]; var ary=['a','b','c']; var ary=[{n:1,m:2},{n:1,m:2},{n:1,m:2}]; var ary=[function a1(){},function a2(){}]; 二.如何创建数组? 1.使用Array构造函数 如:var ary=new Array(); ary[0]=

C#中数组与ArrayList的简单使用

1. 多维数组 2. 锯齿数组 3. 数组的常用操作 4. ArrayList 1. 多维数组 多维数组:行数和列数在定义时已确定 string[,] arr = new string[2, 3]; arr[0, 0] = "坐标:1-1"; arr[0, 1] = "坐标:1-2"; arr[0, 2] = "坐标:1-3"; arr[1, 0] = "坐标:2-1"; arr[1, 1] = "坐标:2-2&qu

求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组

求数组的最小值和最大值 1 //求数组当中最大值和最小值 2 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; 3 //第一种方法 根据排序方法来求最大值和最小值 从小到大排序 第0位就是最小值 最后一位就是最大值 4 arr.sort(function(a,b){ 5 return a-b; //按从小大的情况排序 6 //return b-a; 按从大到小的情况排序 7 }) 8 console.log(arr); 9 var min=arr

前端开发:setTimeout与setInterval 定时器与异步循环数组

前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的,在与博友的分享中可以学到新的知识.得到先驱者的指正.解决工作中遇到的难题.近一个月工作繁忙,新的文章也迟迟未写,今天呢,过来深入了解一下 关于javascript定时器的知识: setTimeout与setInterval简述 setTimeout与setInterval使用方法基本相同,他们接受两

javascript中数组的操作方法

js中的数组也是对象数据类型的,也是由属性名和属性值组成,数组的属性名就是数组中的每一项对应的索引值,数组的属性值就是我们数组中写的每一项的值. 数组中的一些方法 1.起始位置增加和删除 push:向数组的尾部添加新的元素,返回添加后数组的长度,原有数组改变. pop:删除数组尾部的元素,返回删除的元素,原有数组改变. unshift:向数组头部添加元素,返回添加后的数组的长度,原有数组改变. shift:删除数组的第一个元素,返回删除的内容,原有数组改变 2.concat 第一个作用  当参数

js学习随笔一:对象简单、深度克隆(复制)

javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组(Array).对象(Object).函数(Function). 既然对象分为这两类,他们之间的最大差别是复制克隆的差别.普通对象存储的是对象的实际数据,而引用对象存储的是对象的引用地址,而把对象的实际内容单独存放,因为引用对象通常比较庞大,这是数据开销和内存开销优化的手段.通常初学者很难理解这部分内

JavaScript中的数组操作

在之前的一篇博客中提到了一些 JavaScript Array 对象的方法,比如 slice().splice().pop().push() 等,博客链接: http://xitongjiagoushi.blog.51cto.com/9975742/1653063 JavaScript Array还有一些常用的操作或者说技巧,比如清空数组,克隆数组等,下面来看一下. 1. 指定位置插入元素: 使用 Array.prototype.splice()不仅可以删除数组中的元素,也可以在指定位置添加元素