2017-11-15 11 views
1
this.someService.findDevices() 
      .subscribe((segments) => { 
      this.segments = Array.from(segments.segments); 
      this.packs.forEach((pack) => { 
       pack.segments = Array.from(segments.segments); 
       pack.segments[0].devices[0].selected = true; //if commented, output is FALSE 
       console.log(this.segments[0].devices[0]); // shows TRUE 
      }); 
      }); 

this.packsの各パックにsegmentsの配列を追加しようとしている方法を作成しました。 Array.from()を使用して新しい配列を作成していますが、何らかの理由でpack.segments[0].devices[0]をTRUEに設定すると、this.segments[0].devices[0]もtrueに変更されます。次のコードの出力はどうして可能ですか?

どのように解決するか?

+3

、アレイ内の任意の循環参照を持っている場合は、上記の動作しないではないだろう、新しい配列には元のオブジェクトへの参照が残っています。 – Amy

+0

これらのセグメントをクローンする必要があります。現時点では、同じセグメントへの参照をコピーするだけです。 –

+1

サービスなしでこれを再現できると思います。これは純粋にJavaScriptの質問のようです突然変異?また、コードが実際に実行可能で、外部依存関係が0か不明な変数を使用すると、あなたの質問は大幅に改善されます... –

答えて

0

あなたはその中devices配列のクローンを作成しませんsegments配列、の浅いコピーを作っています。

深いクローンを行い、コードを期待どおりに機能させるには、以下を試してみてください。

pack.segments = JSON.parse(JSON.stringify(segments.segments))

注:あなたは、配列の*浅い*のコピーを作っている

0

isSelectedという名前の関数内に最上位ブール変数を作成し、適切に設定します。その後、あなたのループを行います。いずれかの項目がスイッチを変更すると、isSelectedが設定され、適切なブール値が返されます。

関連する問題