2011-09-18 34 views
1

我正在循環使用jQuery每個函數的數組。我爲它分配一個臨時變量來循環而不是實際的數組本身,因爲我使用拼接來修改原始數組。但是,看起來temp即使在拼接array時也會被修改。jQuery的每個數組問題

function example (Data, index, array) { 
      var temp = array; 
      $.each(temp, function(i, v) {  
       if(Data["b"+v].length > index) { 
        //do stuff 
       } else { 
        array.splice(i,1); 
       } 
      }); 
      if(array.length > 0) { 
       example(Data, index+1, array); 
      } 
} 
array = [1,2,3,4] 
Data = {"b1":[a,b,c,d],"b2":[e,f,g,h], "b3":[i,j], "b4":[k,l,m,n]}; 
example(Data, 0, array); 

在示例的第三呼叫,對溫度的第四次迭代,v成爲未定義,並且因此下一行泵出的「無法讀取的未定義長度」錯誤。這發生在array.splice(3,1)被調用後,好像temp指向與數組相同的地方而不是其副本。
任何人都可以幫忙嗎?

回答

3

數組和對象通過引用進行分配。 temparray引用相同的數組。您可以使用.slice()[MDN]創建一個淺表副本:

var temp = array.slice(); 

而不是創建一個副本,你可以遍歷以相反的順序在陣列上:

for(var i = array.length; i--;) { 
    if(Data["b"+array[i]].length > index) { 
     //do stuff 
    } else { 
     array.splice(i,1); 
    } 
} 
+0

以相反的順序遍歷數組看起來好多了,謝謝。 – Michael

2

temp只是對同一個數組的引用,所以temp和array是相同的東西。您想複製,如下所示:

temp = array.slice(0); 
2

分配在JavaScript是通過引用,它不復制對象。如...

var obj1 = {}; 
var obj2 = obj1; 
obj2.hello = "world"; 
console.log(obj1.hello); // logs "world" 

這是因爲obj1obj2都指向內存中的同一個對象。

如果你想使一個數組的副本,可以使用slice方法...

var arrayCopy = myArray.slice(0) 

現在arrayCopy & myArray可以獨立進行編輯。然而,請注意,儘管陣列本身是獨立的,但它們指向的是相同的對象...

arrayCopy[0] === myArray[0]; // true 
arrayCopy[0] = {my: "new object"}; 
arrayCopy[0] === myArray[0]; // now false