2016-11-08 136 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为我带来了这个。