0

ユーザーがボタンをクリックすると、availableTags配列が取得され、 new に格納されvar tagsToWorkWithます。次に、 にあったすべてのタグを移動するために、各行を繰り返しtagsToWorkWith実行します。moveTag()availableTags

の中でmoveTag()、その行をavailableTags使用から削除していsplice()ます。ただし、何らかの理由で、これは から行を削除しているためtagsToWorkWith、関数が1 行おき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

1 に答える 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);
于 2013-03-06T15:46:49.127 に答える