2016-06-16 10 views
0

これは愚かな質問かもしれないので、私は合理的にコーディングしていますが、forループを使用してオブジェクトの複数のインスタンスを作成しようとしていますそのうち日付は1日増分されます。私の問題は、オブジェクトのすべてのインスタンスは、最終的な反復の日付値と同じ日付値をとることです。私はいくつかの検索を行い、1つの答えは、日付を追跡するために使用していた変数が静的であるように見えました。それが私の問題なのか、それとも本当にどのように解決するのかわからないので、どんな助けでも大歓迎です。私は私のコードの特定のインスタンスに二回ループする必要があるためオブジェクト内に同じ値として格納されているすべての増分データ値JavaScript

//getMonday is a function that returns the first day of the week from a given d 
var TestObject = function(date) { 
this.date = date; 
} 

function dateTest() { 
    var today = new Date(); 
    var contents = []; 
    var orderDate = new Date(getMonday(today)); 
    var j = 0; 
    for(var k = 1; k<6; k++) { 
    for(var i = 0; i<6; i++) { 
     contents[j] = new TestObject(orderDate); 
     Logger.log("filling in contents[" + j + "]. I'm putting in date: " + orderDate); 
     j++;  
    } 
    orderDate.setDate(orderDate.getDate() + 1); 
    } 
    for(var i = 0; i < contents.length; i++) { 
    Logger.log(contents[i]); 
    } 
} 

は、2つのループがあり、それはspreadhseetから値を取り除き、行数が変化したときのみ、日付をインクリメントします。

forループ内のログは、すべての正しい日付を出力しますが、dateTestオブジェクトがすべて出力されると、最終的な日付の繰り返しがすべて含まれます。

答えて

0

Javascriptでは、オブジェクトが割り当てられてもコピーされません。それらは参照によって割り当てられます。あなたのRequest()コンストラクタで

、このコード行:

this.date = date 

dateパラメータのコピーを作成されていない、それだけでorderDateオブジェクトに渡された時this.dateを指しています。そのorderDateオブジェクトが将来変更されると、this.dateは変更されたオブジェクトを指します。したがって、ループ内のorderDateオブジェクトを変更すると、すべてRequestオブジェクトは同じorderDateオブジェクトを指してしまうので、ループの最後に値が表示されます。

あなたはこれを行うことによって、あなたのコードを修正することができます

this.date = new Date(date); 

これは、渡された日付オブジェクトのコピーを作成します。

+0

ブリリアント。ありがとうございました。それはとてもシンプルなものでした。実際にJavaScriptがどのように機能するかについて、非常に重要な教訓を教えてくれました。 –

関連する問題