javascript - การเรียงลำดับอาร์เรย์ของช่วง ['55-66', '>55', '<66']?
ตัวอย่างข้อมูลนำเข้า:
[ '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();
}
);
}
รันได้ (mocha+chai ใน plnkr)
หมายเหตุ: ช่วงจะมั่นใจว่าไม่ทับซ้อนกัน และอาจมีสิ่งอื่นๆ ในอาร์เรย์เช่น 'foo' ซึ่งควรวางในลำดับใดก็ได้ที่ท้ายอาร์เรย์
ไอเดีย: ฉันอาจสร้างอาร์เรย์ใหม่เหมือน [[50,59], ['<', '40']] แล้วลองเขียนทับเมธอด .sort อีกครั้ง แต่นั่นดูเหมือนบ้าบิ่น มีวิธีแก้ปัญหาที่ดีกว่านี้ไหม?
คำตอบ #1
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 );คำตอบ #2
คุณสามารถจับคู่ตัวเลขได้ และถ้ามีตัวเลขสองตัว ให้ใช้มันสำหรับการจัดเรียงที่ปรับแล้ว
var array = ['50-59', '60-69', '40-49', '>=70', '<40', 'all'];
array.sort(function (a, b) {
function getV(v) { return v.match(/\d+/g) || [Infinity, Infinity]; }
var aa = getV(a),
bb = getV(b);
return aa[0] - bb[0] || (aa[1] || aa[0]) - (bb[1] || bb[0]);
});
console.log(array)