誰もがあなたを殴り終えたので、私は親切にして、あなたが間違っていることを教えてあげます.
簡単な参照の問題があります。user_data
関数に渡されるオブジェクトから始めます。次に、ここで何user_data
を指しているかについて別の参照を作成します。
window.user_profile = user_data
データは次のようになります。
window.user_profile ->-+
|
+->- {playlists: [ ], ...}
|
user_data ----------->-+
次に、user_data.playlists
ここに別の参照を作成します。
playlists_both_people = user_profile['playlists']
そして今、あなたはこれを手にしています:
window.user_profile ->-+
|
+->- {playlists: [ ], ...}
| ^
user_data ----------->-+ |
|
playlists_both_people --->----+
そして、配列に多くのものをプッシュし、playlists_both_people
なぜそれが変更されたのか疑問に思いuser_data.playlists
ます。この図は、その理由を示しています。何もコピーを作成したことがなく、複数の変数を介して同じデータを参照しているだけです。
バックボーンを使用しているため、アンダースコアがあり、おそらく_.clone
役立つでしょう:
playlists_both_people = _(user_profile['playlists']).clone()
これにより、 の (浅い) コピー(この時点user_profile.playlists
と同じ) が得られ、次は で何も変更されません。user_data.playlists
playlists_both_people
forEach
user_data
との二重参照の問題がまだある可能性があることに注意してくださいwindow.user_profile
。ただし、この問題を解決するために 1 つだけを使用することはできません。浅いコピーしか行わない_.clone
ため、各メンバーを個別に複製する必要があります。_.clone
ただし、おそらく jQuery があり$.extend
、ディープ コピーがサポートされているため、オプションになる可能性があります。
に直接物を入れることもお勧めしませんwindow
。たとえばwindow.app
、アプリケーションの名前空間を設定してから、その名前空間を使用することをお勧めします。
window.app.user_profile = ...