2017-10-10 39 views
0

我有返回一些JSON HTTP服務和予訂閱可觀察到的,那麼結果分配給兩個數組:Angular4是數組引用類型

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

_Is此相同reference_ ..是的。你可以使用'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。這將使這兩個數組從一開始彼此權分離,你不會有那個點後擔心。

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

感謝我用。 –