2016-11-08 113 views
1

排序號碼我有一個角2服務apptService返回Observable<Appointment[]>我然後爲了使用lodash sortBy功能:使用Lodash和打字稿

class Appointment { 
    id: string; 
    distance: number; 
    appointmentDate: date; 
} 

getAppointments(sortOrder) { 
    this.appointments = this 
    .apptService 
    .getAppointments() 
    .map(v => _.sortBy(v, sortOrder)); 
} 

我請getAppointments傳遞一個排序函數,如下所示:

getAppointments((app: Appointment) => app.id); 
getAppointments((app: Appointment) => app.distance); 
getAppointments((app: Appointment) => app.appointmentDate); 

appointmentDateid種類與預期的一樣,但按distance排序時,這些值按字母順序排列即:12,123,15,3

現在,我已經bodged用難看的解決方案:

getAppointments((app: Appointment) => { 
    // this will only work for appointments up to 100000 miles away 
    var s = "00000" + app.distance.toString(); 
    return s.substr(s.length - 5); 
}); 

但這打破我的模式,所以我要尋找一個更好的解決方案,或者至少希望瞭解爲什麼會發生這種情況。

lodash被用於排序,因爲我喜歡在排序箭頭函數中傳遞的語法和易用性,但是如果有更好的解決方案,我不會使用它。

對不起,但沒有笨拙,我無法得到lodash和打字稿一起工作。

+0

這可能是您的實例仍然是一個字符串,即沒有從http響應json映射到正確類型,請嘗試: getAppointments((app:Appointment)=> parseInt(app.distance)); – Meir

+0

請與我們分享您的預約之一。我懷疑這個距離是一個字符串。您可以嘗試通過在語句中添加+來解析值:'getAppointments((app:Appointment)=> + app.appointmentDate);' – Polochon

+0

@meir typescript不允許'parseInt(app.distance)'作爲' parseInt'僅適用於字符串。我可以'parseInt(app.distance.toString())'但我想我會回到我開始的地方。 – paul

回答

1

在我的服務我有這樣的:

let appointments = this 
     .http 
     .get("app/appointments.json") 
     .map((r: Response) => r.json().appointments as Appointment[]); 

雖然每個JSON對象強制轉換爲Appointment[],看來這也許只是爲棉短絨受益?沒有實際發生轉換。這些屬性被設置爲字符串,而不考慮類屬性類型。

進行以下更改可解決問題。

let appointments = this 
    .http 
    .get("app/appointments.json") 
    .map(this.mapAppointments); 

private mapAppointments(response: Response): Appointment[] { 
    return response.json().appointments.map((r) => { 
     let g = new Appointment(); 
     g.id = r.id; 
     g.appointmentDate = r.appointmentDate; 
     g.distance = parseInt(r.distance); 
     return g; 
    }); 
} 

感謝@Polochon和@Meir爲我帶來了這個。