2017-10-10 3 views
0

配列参照型であり、私が観測に加入し、その後、二つの配列に結果を割り当てます。 Angular4は、私はいくつかのJSONを返すHTTPサービスを持っている

selectedData: any[]; 
selectedList: any[]; 

private get() { 
    this.dataService 
     .Get() 
     .subscribe(data => { 
      this.selectedData = data; 
      this.selectedList = data; 
     }, (error) => { 
      console.log(error); 
     }); 
} 

今私はドロップダウンに変化するたびに、私が持っています

onChange(selectedValue) { 
    console.log(this.selectedData); 
    console.log(this.selectedList); 
    this.selectedData["exercisesProgress"] = this.selectedData["exercisesProgress"].filter(x=>x.id == selectedValue); 
} 

aka selectedDataとselectedListは、コンソールにチェックインすると両方がフィルタリングされます。これは同じ参照ですか? selectedListの新しいインスタンスを作成し、selectedListにデータをプッシュする必要がありますか?

+0

これは同じ参考文献です。 'Array.prototype.slice()'を使って、配列の浅いコピーを得ることができます。 –

+0

あなたは私の答えを確認できますか、パフォーマンスの観点から実行可能な方法ですか? –

+0

それはあなたが本当に望むものによって決まります。 1. 'Object.assign()'は浅いコピーを作成し、配列の代わりに_object_を与えます。 'this.selectedData.slice(0)'はあなたに配列の浅いコピーを与えます。 2.あなたが望むものがあれば、他のライブラリ/手段を使って深いコピーを取らなければならないでしょう –

答えて

0

私はコピーして、それを解決しObject.assign({}、データ)を持つオブジェクト:

private get() { 
    this.dataService 
     .Get() 
     .subscribe(data => { 
      this.selectedData = data; 
      this.selectedList = Object.assign({}, data); 
     }, (error) => { 
      console.log(error); 
     }); 
} 

onSelect(event) { 
    console.log(event); 
} 

onChange(selectedValue) { 
    console.log(this.selectedData); 
    console.log(this.selectedList); 
    this.selectedData = Object.assign({}, this.selectedList); 
    this.selectedData["exercisesProgress"] = this.selectedData["exercisesProgress"].filter(x=>x.id == selectedValue); 
} 
0

あなたはselectedDataselectedListの値を初期化するときは、非構造を使用することができます。これにより、最初から2つの配列を互いに分離することができます。その点の後で、それを心配する必要はありません。

private get() { 
    this.dataService.Get() 
    .subscribe(data => { 
     this.selectedData = [...data]; // <======= 
     this.selectedList = [...data]; // <======= 
    }, (error) => { 
     console.log(error); 
    }); 
} 
+0

これはアレイ上でのみ使用できますか?私は間違いを犯したので、this.selecteDataは配列であってはならず、 'Object'の場合は –

+1

@AmelSalibasicのオブジェクトであり、' this.selectedData = Object.assign({}、data); 'を使うことができます。 'data'が' Object'の場合.. –

+0

感謝しました。 –

関連する問題