2017-03-28 2 views
0

次のJavaScript(Typescript)サンプルがあります。ここでは、配列を初期化し、endタイムスタンプが範囲に含まれるまで1時間ごとのタイムスタンプを押します。ループからのconsole.logは期待値をログアウトする。array.push()にはループの最終値のみが含まれています

ループ2017-03-27T18:00:00 + 01:00

ループ2017-03-27T19:00:00 + 01:00

ループ2017-03-27T20:00 :00 + 01:00

ただし、結果の配列には正しい数のレコードしか含まれていないようですが、すべて最終値です。

結果2017-03-28T18:00:00 + 01:00

結果2017-03-28T18:00:00 + 01:00

これはなぜでしょうか?

+0

'nextTime'、MomentJSインスタンスは何ですか? –

+0

@TJCrowderはい、質問を更新しました –

答えて

5

MomentJSオブジェクトは、状態の変更可能(変更可能)なオブジェクトです。 MomentJSオブジェクトでaddを呼び出すと、それが変更されますが、新しいオブジェクトは作成されません。同じオブジェクトへの参照を返します。オブジェクト

 
    +−−−−−−−−−+   
res−>| (array) |   
    +−−−−−−−−−+  +−−−−−−−−−−+  
    | 0  |−−−−−−−>| (object) |  
    +−−−−−−−−−+  +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
         | d:  |−−>|     (Date)     | 
         +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
             | [[TimeValue]]: 2017−03−27T18:00:00+01:00 | 
             +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 

あなた

let nextTime = moment(res[res.length - 1]).add(1, 'hour'); 
// ... 
res.push(nextTime); 

修正をしてresの上にそれを別の参照プッシュ:だから、あなたはこれで始めると言う

 
    +−−−−−−−−−+   
res−>| (array) |   
    +−−−−−−−−−+  +−−−−−−−−−−+ 
    | 0  |−−−−+−−>| (object) | 
    | 1  |−−−/ +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
    +−−−−−−−−−+  | d:  |−−>|     (Date)     | 
         +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
             | [[TimeValue]]: 2017−03−27T19:00:00+01:00 | 
             +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 

お知らせをどのようにオブジェクトの状態( [MomentJSオブジェクトで使用されているDateの[[TimeValue]])が変更されました。あなたは再びそれを行う場合

、私たちは再びそれを更新します。

 
    +−−−−−−−−−+   
res−>| (array) |   
    +−−−−−−−−−+  +−−−−−−−−−−+ 
    | 0  |−−−−+−−>| (object) | 
    | 1  |−−−/ +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
    | 2  |−−/  | d:  |−−>|     (Date)     | 
    +−−−−−−−−−+  +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
             | [[TimeValue]]: 2017−03−27T20:00:00+01:00 | 
             +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 

は代わりに、新しいオブジェクトを作成します。オリジナルのクローンをmomentとすることで、これを行うことができます。

let nextTime = moment(res[res.length - 1]).add(1, 'hour'); 
// ------------^^^^^^^ ----------------^ 
// ... 
res.push(nextTime); 

あなたがそれを行う場合は、同じ出発点から、我々が得る:

 
    +−−−−−−−−−+   
res−>| (array) |   
    +−−−−−−−−−+  +−−−−−−−−−−+ 
    | 0  |−−−−−−−>| (object) | 
    | 1  |−−−−+ +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
    | 2  |−−+ | | d:  |−−>|     (Date)     | 
    +−−−−−−−−−+ | | +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
        | |     | [[TimeValue]]: 2017−03−27T18:00:00+01:00 | 
        | | +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
        | +−−>| (object) |             
        |  +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
        |  | d:  |−−>|     (Date)     | 
        |  +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
        +−−−−>    | [[TimeValue]]: 2017−03−27T19:00:00+01:00 | 
         +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
         | (object) |             
         +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
         | d:  |−−>|     (Date)     | 
         +−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
             | [[TimeValue]]: 2017−03−27T20:00:00+01:00 | 
             +−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
+2

[クローンドック](https://momentjs.com/docs/#/parsing/moment-clone/) –

+0

@ArthurCinaderはOPが使用しているライブラリを推測できますその問題をすばやく解決してください。 –

関連する問題