js 笔记-数组的拷贝和合并

一、对象和数组的拷贝

1.concat()

var arr1={'1','2','3'};

var arr2 = arr1.concat();

虽然返回的数组是新的数组,但是如果数组元素是对象时,两个数组的对象仍然是同一个引用,修改对象会影响到两个数组。

2.extend方法实现拷贝

var arr2 = $.extend([],arr1);

如果拷贝对象是数组,那么效果与concat一样;如果拷贝对象是Object【使用:$.extend({},objSrc)】,那么拷贝后的对象和原对象也不是同一个指向,互相之间也不影响。

3.深拷贝方法

var arr2 = $.extend(true,[],arr1);

拷贝后的数组的元素和原数组的元素不指向同一个对象,是两个完全分离的数组,互相不影响。

 

结论:

 

对象拷贝合适的方法是$.extend({},object);
数组拷贝合适的方法是$.extend(true,[],arrSrc);

 

示例:

 1         //1.concat
 2         var arrSrc = [
 3             {
 4                 name:"test1",
 5                 age:40
 6             },
 7             {
 8                 name:"test2",
 9                 age:30
10             }
11         ];
12         var arrTarget = arrSrc.concat();
13         console.log(arrTarget);//此时元素1尚未改变(当然,在控制台打出的Log里元素1是改变了的,因为随后arrTarget就随着改变了。)数组仍是两个元素
14         arrSrc[0].type="changed";
15         arrSrc[2] = {
16             name:"test3",
17             age:30
18         };
19         console.log(arrSrc);//元素1改变,并且数组新增一个元素。
20         console.log(arrTarget);//元素1改变,但是数组仍是两个元素
21 
22         //2.extend({},object) 效果与concat一样,只是concat是针对数组的操作,而extend是针对所有的Object操作。
23         // 如果一个对象要进行拷贝,可以用这种方法,这样拷贝后的对象和原来的对象就不是一个指向了。
24         var arrSrc2 = [
25             {
26                 name:"test1",
27                 age:40
28             },
29             {
30                 name:"test2",
31                 age:30
32             }
33         ]
34 
35         var arrTarget2 = $.extend([],arrSrc2);
36         console.log(arrTarget2);
37         arrSrc2[0].name = "changed";
38         arrSrc2[2] ={
39             name:"test3",
40             age:30
41         }
42         console.log(arrSrc2);
43         console.log(arrTarget2);
44 
45 //        3.extend(true,{},object) 深度拷贝,如果数组的元素是一个对象,拷贝后的数组的元素和原数组的元素不指向同一个对象,是两个完全分离的数组,互相不影响。
46         var arrSrc3 = [
47             {
48                 name:"test1",
49                 age:40
50             },
51             {
52                 name:"test2",
53                 age:30
54             }
55         ]
56 
57         var arrTarget3 = $.extend(true,[],arrSrc3);
58         console.log(arrTarget3);
59         arrSrc3[0].name = "changed";
60         arrSrc3[2] ={
61             name:"test3",
62             age:30
63         }
64         console.log(arrSrc3);
65         console.log(arrTarget3);
数组拷贝

 

二、数组合并

1、concat

可以完整的合并两个数组,返回新数组,但是如果数组的元素是一个对象,那么合并后的数组的对象和原来的数组的对象仍是同一个指向,修改对象会影响两个数组。

数组各自增减元素是独立的,不影响的。

2、extend(false,[],arr1,arr2)

合并后的数组是一个新数组,三个数组各自增减元素互不影响,但是元素仍然指向同一个对象,所以元素的操作会彼此影响。

注意:合并后的数组相同位置的元素会被覆盖。

3.extend(true,[],arr1,arr2)

合并后的数组是一个新数组,三个数组的元素不指向同一个对象,是三个完全分离的数组,互相不影响。

注意:合并后的数组相同的元素也会合并。

 

结论:

 

数组合并方法只有concat可用。

 

为了数组元素之间互不影响,可以先concat,再把合并后的数组进行拷贝。(未经测试)

 

示例:

  1 //1.concat 合并后的数组是一个新数组,三个数组各自增减元素互不影响,但是元素仍然指向同一个对象,所以元素的操作会彼此影响。
  2         var arrSrc41 = [
  3             {
  4                 name:"test1",
  5                 age:40
  6             },
  7             {
  8                 name:"test2",
  9                 age:30
 10             }
 11         ];
 12         var arrSrc42 = [
 13             {
 14                 name:"test99",
 15                 age:40
 16             }
 17         ]
 18 
 19         var newArr = arrSrc41.concat(arrSrc42);
 20         console.log(arrSrc41);
 21         console.log(arrSrc42);
 22         console.log(newArr);
 23         arrSrc41[0].name = "changed";//第一个数组的名字修改,影响newArr
 24         arrSrc42[0].name = "test88";//第二个数组的名字修改,影响newArr
 25         arrSrc41[2] ={
 26             name:"test3",
 27             age:30
 28         }//第一个数组新增元素,不影响newArr
 29         newArr[2].age = 99; //新数组第三个元素的年龄修改,影响arrSrc42
 30         console.log(arrSrc41);
 31         console.log(arrSrc42);
 32         console.log(newArr);
 33 
 34 
 35         //2.extend(false,[],arrSrc51,arrSrc52) 合并后的数组是一个新数组,三个数组各自增减元素互不影响,但是元素仍然指向同一个对象,所以元素的操作会彼此影响。
 36         //注意:合并后的数组相同的元素会被覆盖。所以合并后的数组长度为2,而不是3.第一个数组的第一个元素被第二个数组的第一个元素覆盖。
 37         var arrSrc51 = [
 38             {
 39                 name:"test1",
 40                 age:40,
 41                 city:"QD"
 42             },
 43             {
 44                 name:"test2",
 45                 age:30
 46             }
 47         ];
 48         var arrSrc52 = [
 49             {
 50                 name:"test99",
 51                 age:40,
 52                 country:"China"
 53             }
 54         ]
 55 
 56         var newArr2 = $.extend(false,[],arrSrc51,arrSrc52)
 57         console.log(arrSrc51);
 58         console.log(arrSrc52);
 59         console.log(newArr2);
 60         arrSrc51[0].name = "changed";//第一个数组的名字修改,影响newArr2
 61         arrSrc52[0].name = "test88";//第二个数组的名字修改,影响newArr2
 62         arrSrc51[2] ={
 63             name:"test3",
 64             age:30
 65         }//第一个数组新增元素,不影响newArr2
 66         newArr2[0].age = 99; //新数组第一个元素的年龄修改,影响第二个数组的第一个元素(因为第二个数组的第一个元素把第一个数组的第一个元素覆盖了)
 67         console.log(arrSrc51);
 68         console.log(arrSrc52);
 69         console.log(newArr2);
 70 
 71         //3.extend(true,[],arrSrc51,arrSrc52) 合并后的数组是一个新数组,三个数组的元素不指向同一个对象,是三个完全分离的数组,互相不影响。
 72         //注意:合并后的数组相同的元素也会合并。所以合并后的数组长度为2,而不是3.第一个数组的第一个元素和第二个数组的第一个元素合并。
 73         var arrSrc61 = [
 74             {
 75                 name:"test1",
 76                 age:40,
 77                 city:"QD"
 78             },
 79             {
 80                 name:"test2",
 81                 age:30
 82             }
 83         ];
 84         var arrSrc62 = [
 85             {
 86                 name:"test99",
 87                 age:40,
 88                 country:"China"
 89             }
 90         ]
 91 
 92         var newArr3 = $.extend(true,[],arrSrc61,arrSrc62)
 93         console.log(arrSrc61);
 94         console.log(arrSrc62);
 95         console.log(newArr3);
 96         arrSrc61[0].name = "changed";//第一个数组的名字修改,不影响newArr2
 97         arrSrc62[0].name = "test88";//第二个数组的名字修改,不影响newArr2
 98         arrSrc61[2] ={
 99             name:"test3",
100             age:30
101         }//第一个数组新增元素,不影响newArr2
102         newArr3[0].age = 99; //新数组第一个元素的年龄修改,不影响
103         console.log(arrSrc61);
104         console.log(arrSrc62);
105         console.log(newArr3);
数组合并
posted @ 2014-06-21 11:22  半瓶子水  阅读(607)  评论(0编辑  收藏  举报