javascript中把一個數組的內容全部賦值給另外一個數組


如:
var a = [1,2,3,4];
var b= [];
b = a;
這個不是把值賦值過去而是b作為a的引用,b改變的是a
如何b指向的是一個新數組,a把元素值全部賦值過去?

1、普通數組可以使用   var b = [].concat(a);

-----------------------------------------------------------------------------------------------------

2、我遇到一個jquery對象類型的數組是[Object(Array)]類型,其拼接的數組字符串為:

[{
                name: 'Berlin-new',
                type: 'column',
                id: 'berlin', 
                data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
            },{
                name: 'Tokyo-new',
                type: 'spline', 
                data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
            }]

想將array賦給array2,然后將array2中的data截取一部分,返回array2

var array2= [].concat(array);
                $.each(array2, function (i, obj) {
                    var data = obj.data;
                    obj.data = data.slice(data.length - num, data.length);
                });

這樣截取成功,但仍然影響array本身的data;

采用 var arr = $.makeArray( obj );后仍不起作用;

最后用循環創建新數組解決

var result = [];        

$.each(array, function (i, obj) {

            var c = {};   

          $.each(obj, function (key, val) {

                if (key == 'data') {  

                   c[key] = val.slice(val.length - num, val.length);

                } else {  

                   c[key]=val;

                }

            }) ;

            result.push(c);

        });

 

一、push與concat

 

push的定義是:像數組末尾添加一個或更多元素,並返回新的長度。該方法會改變數組的長度。

concat的定義是:連接兩個或更多的數組,並返回結果,該方法不會改變現有數組,而僅僅會返回數組的一個副本

  1. var a = [1,2];  
  2. a.push([3,4]);  
  3. a.concat(5);  
  4. //a為1 2 3,4 5  
var a = [1,2];
a.push([3,4]);
a.concat(5);
//a為1 2 3,4 5

 

二、深拷貝與淺拷貝

1.淺拷貝

JavaScript存儲對象都是存地址的,所以淺復制會導致 a 和 b 指向同一塊內存地址

數組的賦值其實相當於給了索引,改變其中一個變量其他引用都會改變

  1. var a = [1,2,3];  
  2. var b = a;  
  3. b[0] = 4;  
  4. //a為4 2 3  
  5. //b為4 2 3  
var a = [1,2,3];
var b = a;
b[0] = 4;
//a為4 2 3
//b為4 2 3

 

根據上面存儲對象的問題,這里就可以解決另一個問題:

    原始參數(比如一個具體的數字)被作為傳遞給函數;值被傳遞給函數,如果被調用函數改變了這個參數的值,這樣的改變不會影響到全局或調用函數。

    你傳遞一個對象(在js里數組不是簡單數據類型,而是對象)到一個函數,如果在函數里面改變了這個參數的內容,在外部這個變化是可見的。

 

2.深拷貝

 

(1)slice 函數

(2)concat 函數

(3)assgin

 

三個函數的原理都是返回數組的一個副本(相當於另外開辟內存空間),所以並不會改變數組本身的的值

 

但是這里有一點不同,就是assgin與其他兩點的不同

雖然說assgin也是深拷貝,但是他只是第一層深拷貝,第二層之后還是進行淺拷貝,例子如下:

  1. var a = {  
  2.     a1:{  
  3.         aa1:'11',  
  4.         aa2:'22'  
  5.     }  
  6. }  
  7. var b = object.assgin({},a);  
  8. var c = object.assgin({},a);  
  9. b.a1.aa1 = 33;  
  10. /*  
  11. b:{  
  12.     a1:{  
  13.         aa1:'33',  
  14.         aa2:'22'  
  15.     }  
  16. }  
  17. c:{  
  18.     a1:{  
  19.         aa1:'33',  
  20.         aa2:'22'  
  21.     }  
  22. }  
  23. */  
var a = {
	a1:{
		aa1:'11',
		aa2:'22'
	}
}
var b = object.assgin({},a);
var c = object.assgin({},a);
b.a1.aa1 = 33;
/*
b:{
	a1:{
		aa1:'33',
		aa2:'22'
	}
}
c:{
	a1:{
		aa1:'33',
		aa2:'22'
	}
}
*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM