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);
}
}
作品完美,感謝你注意到關於深拷貝。由於我已經加載了jQuery庫,你知道'a.slice(0)'和'jQuery.extend(true,{},a)'之間是否存在主要的速度差異:http: //sackoverflow.com/a/122704/761793 – 2013-03-06 15:55:22
通過閱讀引用問題的更多答案後,我看到'slice(0)'做了更多的軟性克隆,與我引用的函數不同。我會繼續做更多的閱讀並繼續前進,謝謝! – 2013-03-06 15:59:06
@John是的,這是一個「淺」副本。如果數組中包含對象,那麼這些對象不會被深度複製。 – Pointy 2013-03-06 16:02:03