Beispiel Eingabe:Sortierreihen von Bereichen ['55 -66 ','> 55 ',' <66 ']?
[ '50-59', '60-69', '40-49', '>=70', '<40' ]
Erwarteter Ausgang
[ '<40', '40-49', '50-59', '60-69', '>=70' ]
Attempt; erweitert aus meinem frühen Einzeiler (zum Debuggen):
export function sort_ranges(ranges: string[]): string[] {
const collator = new Intl.Collator(undefined, {
numeric: true,
sensitivity: 'base',
ignorePunctuation: true
});
return ranges.sort((a: string, b: string): number => {
const bNaN: boolean = !isNaN(parseInt(b[0]));
const col =() =>
console.info(`collator(${a}, ${b}) = ${collator.compare(a, b)}`
) || collator.compare(a, b);
if (a[0] === '<' && bNaN) {
console.info('< =', a);
return -1;
}
else if (a[0] === '>' || b[0] === '>') {
console.info('> =', a);
return 1;
}
else return col();
}
);
}
Runnable (mocha+chai in a plnkr)
Hinweis: Bereiche werden garantiert nicht überlappend sein, und es andere Dinge in der Anordnung wie ‚foo‘, das sollte sein in beliebiger Reihenfolge am Ende des Arrays platziert werden.
Ideen: Ich könnte ein neues Array wie [[50,59], ['<', '40']]
dann versuchen, überschreiben die .sort
Methode wieder, aber das scheint verrückt. Gibt es eine bessere Lösung?
ich nicht, warum ist die '' 60-69' und 50-59' vor '40-49' in dem erwarteten Ergebnis. –
Whoops, mein Schlechter; kopiert es in Eile –
Wo würde 51-57 gehen? – mplungjan