2016-11-08 1 views
1

I einen Winkel 2 Service apptService die Observable<Appointment[]> kehrt die ich dann die lodash bestellen Verwendung sortBy Funktion:Sortiernummer unter Verwendung Lodash und Maschinenschrift

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

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

Ich nenne getAppointments eine Sortierfunktion wie vorbei so:

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

Die appointmentDate und id Sorten sind wie erwartet, aber beim Sortieren nach distance sind die Werte alphanumerisch geordnet dh: 12, 123, 15, 3

Vorerst habe ich eine unschöne Lösung mit 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); 
}); 

aber das bricht mir das Muster, so dass ich bin auf der Suche nach einer besseren Lösung, oder in der Hoffnung zumindest um zu verstehen, warum dies geschieht.

lodash wurde für die Sortierung verwendet, weil mir die Syntax und die Leichtigkeit der Übergabe der Sortierpfeilfunktion gefallen hat, aber ich bin nicht an die Verwendung gebunden, wenn es eine bessere Lösung gibt.

Und tut mir leid, aber kein Plumpser, ich konnte nicht Lodash und Typoskript überhaupt dort zusammenarbeiten.

+0

Es könnte sein, dass Ihre Instanz noch ein String ist, das heißt nicht auf die richtige Art von der HTTP-Antwort json abgebildet, versuchen: getAppointments ((App: Termin) => parseInt (app.distance)); – Meir

+0

Bitte teilen Sie uns eine Dump von einem Ihrer Termine. Ich vermute, dass die Entfernung eine Zeichenfolge ist. Sie können versuchen, den Wert zu analysieren, indem Sie der Anweisung ein + hinzufügen: 'getAppointments ((app: Appointment) => + app.appointmentDate);' – Polochon

+0

@meir typescript lässt 'parseInt (app.distance)' as 'nicht zu parseInt' ist nur für Strings. Ich könnte 'parseInt (app.distance.toString())' 'aber dann denke ich, dass ich wieder da bin wo ich angefangen habe. – paul

Antwort

1

In meinem Dienst hatte ich dies:

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

Obwohl jedes json Objekt als Appointment[] gegossen wird, es erscheint dies vielleicht nur für die Linters profitieren ?, und keine tatsächliche Umsetzung erfolgt. Die Eigenschaften werden als Zeichenfolgen ohne Berücksichtigung der Klasseneigenschaftstypen festgelegt.

Durch die folgenden Änderungen wurde das Problem behoben.

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; 
    }); 
} 

Dank @Polochon und @Meir für mich zu diesem führen.

Verwandte Themen