ค้นหาเว็บไซต์

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)

บทความที่เกี่ยวข้อง