A T*_*A T 5 javascript arrays sorting range typescript
输入示例:
[ '50-59', '60-69', '40-49', '>=70', '<40' ]
Run Code Online (Sandbox Code Playgroud)
预期产出
[ '<40', '40-49', '50-59', '60-69', '>=70' ]
Run Code Online (Sandbox Code Playgroud)
尝试; 从我之前的单行扩展(用于调试):
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();
}
);
}
Run Code Online (Sandbox Code Playgroud)
Runnable(mocha + chai in plnkr)
注意:范围保证不重叠,并且数组中可能还有其他内容,如'foo',它应该以数组末尾的任何顺序放置.
想法:我可以构建一个新的数组,[[50,59], ['<', '40']]然后尝试.sort再次覆盖该方法,但这似乎很疯狂.有更好的解决方案吗?
小智 7
var a = [ '50-59', '60-69', '40-49', '>=70', '<40' ];
a.sort(function(a,b) {
if (a[0] === '<') return -1;
if (a[0] === '>') return 1;
if (b[0] === '<') return 1;
if (b[0] === '>') return -1;
return a.match(/\d+/)[0] - b.match(/\d+/)[0];
});
console.dir( a );Run Code Online (Sandbox Code Playgroud)
不幸的是,其他答案没有处理边缘情况。作为额外的好处,没有正则表达式:
function sort_ranges(ranges/*: string[]*/)/*: string[]*/ {
return ranges.sort((a/*: string*/, b/*: string*/)/*: number*/ => {
if (a[0] === '<') return -1;
else if (a[0] === '>') return a[0].charCodeAt() - b[0].charCodeAt();
else if (isNaN(parseInt(a[0])) || b[0] === '<') return 1;
else if (b[0] === '>' || isNaN(parseInt(b[0]))) return -1;
return parseInt(a.split('-')[0]) - parseInt(b.split('-')[0])
});
}
// Test code for StackOverflow:
const expected_arrays = Object.freeze([
[ '<40', '40-49', '50-59', '60-69', '>=70' ],
[ '40-49', '50-59', '60-69', '>=70', 'all' ]
]);
const input_arrays = Object.freeze([
[ '60-69', '<40', '>=70', '50-59', '40-49' ],
[ '50-59', 'all', '40-49', '>=70', '60-69' ]
]);
for(let i=0; i<input_arrays.length; i++)
console.info(sort_ranges(input_arrays[i]), '===', expected_arrays[i]);Run Code Online (Sandbox Code Playgroud)