【发布时间】:2017-08-29 16:27:20
【问题描述】:
示例输入:
[ '50-59', '60-69', '40-49', '>=70', '<40' ]
预期输出
[ '<40', '40-49', '50-59', '60-69', '>=70' ]
尝试;从我之前的单行扩展(用于调试):
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)
注意:范围保证不重叠,并且数组中可能还有其他内容,例如 'foo',应该以任意顺序放在数组末尾。
想法:我可以构建一个像[[50,59], ['<', '40']] 这样的新数组,然后尝试再次覆盖.sort 方法,但这似乎很疯狂。有没有更好的解决方案?
【问题讨论】:
-
我不明白为什么
40-49之前的60-69和50-59在预期结果中。 -
哎呀,我的错;匆忙复制过来
-
51-57 会去哪里?
-
保证范围不重叠
-
James:
parseInt这样做了,但是当我在数组中有其他东西是NaN时,我遇到了问题。这就是最初出现isNaN代码的原因。还有 mplungjan 所说的
标签: javascript arrays sorting typescript range