我有一个有角度的2服务apptService
,返回Observable<Appointment[]>
然后我使用lodash sortBy
函数订购:
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
目前,我使用以下方法提出了难看的解决方案:
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 :(得分: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带领我这一点。