2017-06-19 8 views
0

ユーザーがクリックするたびに配列値に対してアクションをトリガーしようとしていますが、その配列が関数の外にあっても何らかの理由で引き続き値を変更します。外部の配列の値が影響を受けないようにする方法を知っている人はいますか? お時間をいただきありがとうございました。アレイの変更を禁止する

のjQuery:

var nums = new Array('one', 'two', 'three', 'four', 'five'); 

$('.nums')on('click', function() { 
    var numId = $(this).attr('id'); 
    var newNums = nums; 
    var num = newNums.indexOf('#'+numId); 
    newNums.length = num + 1; 

    console.log('#'+numId, nums, newNums, num); 
}); 
+0

をHTMLコードを記載してください –

答えて

0

がNUMSにnewNumsにnewNums = numsポイントを使用して、そしてNUMS配列のコピーを作成しません。コピーを作成するには、Array#sliceを使用することができます。これは浅いコピーであることを

var newNums = nums.slice(0); 

注意を。元の配列にオブジェクトが含まれている場合は、新しい配列(スライスの後)に元のオブジェクトへの参照が含まれ、「新しい」オブジェクトを変更すると元のオブジェクトに変更されます。この場合は、手動で配列を繰り返し、新しいオブジェクトを作成することで詳細なコピーを作成する必要があります。あなたはslice()を使用して値によって配列をコピーする必要があり

+0

素晴らしい、それは魅力のように働いた!ありがとうございます@Ori Doriのお時間とご協力をよろしくお願い申し上げます。 –

+0

@IVIVP - 歓迎:) –

2

、あなたの現在の割り当てはnums配列への参照を与え、いつでも関数内で値の変更は、最初の配列が影響を受けます:

var nums = new Array('one', 'two', 'three', 'four', 'five'); 

    $('.nums')on('click', function() { 
     var numId = $(this).attr('id'); 
     var newNums = nums.slice(); 
     var num = newNums.indexOf('#'+numId); 
     newNums.length = num + 1; 

     console.log('#'+numId, nums, newNums, num); 
    }); 
+1

本当にすばらしい答え@KADをありがとうございます。直前にオリと言いましたが、その技術は完璧に機能しました。 大変お手伝いをしてくれてありがとうございました(と時間があります) –

+0

あなたは大歓迎です:) – KAD

関連する問題