使用Lodash和打字稿
问题描述:
排序号码我有一个角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);
appointmentDate
和id
种类与预期的一样,但按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和打字稿一起工作。
答
在我的服务我有这样的:
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为我带来了这个。
这可能是您的实例仍然是一个字符串,即没有从http响应json映射到正确类型,请尝试: getAppointments((app:Appointment)=> parseInt(app.distance)); – Meir
请与我们分享您的预约之一。我怀疑这个距离是一个字符串。您可以尝试通过在语句中添加+来解析值:'getAppointments((app:Appointment)=> + app.appointmentDate);' – Polochon
@meir typescript不允许'parseInt(app.distance)'作为' parseInt'仅适用于字符串。我可以'parseInt(app.distance.toString())'但我想我会回到我开始的地方。 – paul