2013-03-06 33 views
0

當用戶點擊一個按鈕時,我抓住availableTags陣列,將它存儲在新的var tagsToWorkWith中。然後我遍歷每個行上的tagsToWorkWith並運行moveTag(),以便移動availableTags中的每個標記。迭代數組並使用splice()更新父數組?

moveTag()裏面,我使用splice()availableTags中刪除那一行。但是,由於某種原因,這將從tagsToWorkWith中刪除該行,這會導致我的for()函數僅在每隔一行上運行moveTag()

爲什麼splice()tagsToWorkWith刪除行?我明確地設置tagsToWorkWith等於原來的availableTags,以避免這個問題,但似乎並沒有工作。

下面的代碼與錯誤的http://jsfiddle.net/EdnxH/

var availableTags = [{"label":"Label A","value":"1"},{"label":"Label B","value":"2"}, {"label":"Label C","value":"3"}]; 

$(document).on('click', '#clickButton', function() { 
    var tagsToWorkWith = availableTags;       
    for(var countera=0; countera< tagsToWorkWith.length; countera++) { 
     alert(tagsToWorkWith[countera].label); 
     moveTag(tagsToWorkWith[countera].label, tagsToWorkWith[countera].value); 
     //This should match the first alert label, since we haven't increased the counter yet. But, for some reason, moveTag()'s splice() removes the row from tagsToWorkWith. 
     alert(tagsToWorkWith[countera].label); 
    } 
}); 

function moveTag(itemToMove, itemToMoveValue) { 
    var selectedTagArrayIndex = -1;  
    for(var counter=0; counter< availableTags.length; counter++) { 
     if (availableTags[counter].value == itemToMoveValue) { 
      selectedTagArrayIndex = counter; 
     } 
    } 
    if (selectedTagArrayIndex > -1) { 
     availableTags.splice(selectedTagArrayIndex, 1); 
    } 
} 

回答

4

數組是對象運行,而對象不是「深複製」當你將變量之間的引用。因此,你的兩個變量都引用完全相同的對象。

這樣:

var a = ["hello", "world"]; 
var b = a; 
a[2] = "again"; 
alert(b[2]); // "again" because "a" and "b" are the same object 

如果你想使一個數組的副本,你可以使用:

var b = a.slice(0); 
+0

作品完美,感謝你注意到關於深拷貝。由於我已經加載了jQuery庫,你知道'a.slice(0)'和'jQuery.extend(true,{},a)'之間是否存在主要的速度差異:http: //sackoverflow.com/a/122704/761793 – 2013-03-06 15:55:22

+0

通過閱讀引用問題的更多答案後,我看到'slice(0)'做了更多的軟性克隆,與我引用的函數不同。我會繼續做更多的閱讀並繼續前進,謝謝! – 2013-03-06 15:59:06

+0

@John是的,這是一個「淺」副本。如果數組中包含對象,那麼這些對象不會被深度複製。 – Pointy 2013-03-06 16:02:03