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

การเรียงลำดับอาเรย์ใน TypeScript


ฉันพยายามที่จะหาคำตอบเกี่ยวกับปัญหาที่แปลกมากที่ฉันเจอเกี่ยวกับ TypeScript มันได้จัดการกับนิพจน์ Boolean แบบ inline เหมือนกับว่าเป็นชนิดของค่าตัวแรกแทนที่จะเป็นนิพจน์ทั้งหมด

ดังนั้นถ้าคุณลองทำอะไรที่ง่ายๆ เช่นต่อไปนี้:

var numericArray:Array<number> = [2,3,4,1,5,8,11];

var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);

TryIt

คุณจะได้รับข้อผิดพลาดเกี่ยวกับวิธีการเรียงลำดับโดยแจ้งว่าพารามิเตอร์ไม่ตรงกับสัญลักษณ์การโทรเป้าหมาย เนื่องจากผลลัพธ์ของคุณเป็นตัวเลข ไม่ใช่บูลีน แต่ฉันเดาว่าฉันพลาดอะไรบางอย่างไปเพราะฉันแน่ใจว่า n1>n2 เป็นคำสั่งบูลีน

คำตอบ #1

ตัวเลข

เมื่อเรียงลำดับตัวเลข คุณสามารถใช้การเปรียบเทียบแบบย่อได้:

var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];

var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);

เช่น - แทนที่จะเป็น <.

ประเภทอื่น ๆ

ถ้าคุณกำลังเปรียบเทียบสิ่งอื่นๆ คุณจะต้องแปลงการเปรียบเทียบให้อยู่ในรูปตัวเลข

var stringArray: string[] = ['AB', 'Z', 'A', 'AC'];

var sortedArray: string[] = stringArray.sort((n1,n2) => {
    if (n1 > n2) {
        return 1;
    }

    if (n1 < n2) {
        return -1;
    }

    return 0;
});

วัตถุ

สำหรับวัตถุ คุณสามารถจัดเรียงตามคุณสมบัติ โปรดจำข้อมูลด้านบนเกี่ยวกับความสามารถในการย่อประเภทตัวเลข ตัวอย่างด้านล่างใช้ได้ไม่ว่าจะเป็นประเภทใด

var objectArray: { age: number; }[] = [{ age: 10}, { age: 1 }, {age: 5}];

var sortedArray: { age: number; }[] = objectArray.sort((n1,n2) => {
    if (n1.age > n2.age) {
        return 1;
    }

    if (n1.age < n2.age) {
        return -1;
    }

    return 0;
});

คำตอบ #2

ข้อผิดพลาดนั้นถูกต้องอย่างสมบูรณ์

อย่างที่มันพยายามจะบอกคุณ .sort() รับฟังก์ชันที่คืนค่าตัวเลข ไม่ใช่บูลีน

คุณต้องส่งค่าลบหากรายการแรกมีค่าน้อยกว่า; ค่าบวกหากมันทว่ามีค่ามากกว่า หรือศูนย์หากทั้งสองเท่ากัน

คำตอบ #3

คำตอบเยี่ยมมาก Sohnee อยากจะเพิ่มว่า หากคุณมีอาร์เรย์ของอ็อบเจ็กต์และคุณต้องการจัดเรียงตามคีย์ จะเกือบเหมือนกัน นี่คือตัวอย่างของวิธีที่สามารถจัดเรียงทั้งตามวันที่ (ตัวเลข) หรือชื่อเรื่อง (สตริง):

    if (sortBy === 'date') {
        return n1.date - n2.date
    } else {
        if (n1.title > n2.title) {
           return 1;
        }
        if (n1.title < n2.title) {
            return -1;
        }
        return 0;
    }

สามารถทำให้ค่าข้างในเป็นตัวแปร n1[field] กับ n2[field] ได้เช่นกันถ้ามันต้องการความยืดหยุ่นมากขึ้น แค่เก็บความต่างระหว่างสตริงกับตัวเลขไว้

คำตอบ #4

let numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];

let sortFn = (n1 , n2) => number { return n1 - n2; }

const sortedArray: number[] = numericArray.sort(sortFn);

เรียงตามบางฟิลด์:

let arr:{key:number}[] = [{key : 2}, {key : 3}, {key : 4}, {key : 1}, {key : 5}, {key : 8}, {key : 11}];

let sortFn2 = (obj1 , obj2) => {key:number} { return obj1.key - obj2.key; }

const sortedArray2:{key:number}[] = arr.sort(sortFn2);

คำตอบ #5

เรียงลำดับอาเรย์ผสม (ตัวอักษรและตัวเลข)

function naturalCompare(a, b) {
   var ax = [], bx = [];

   a.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) });
   b.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) });

   while (ax.length && bx.length) {
     var an = ax.shift();
     var bn = bx.shift();
     var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
     if (nn) return nn;
   }

   return ax.length - bx.length;
}

let builds = [ 
    { id: 1, name: 'Build 91'}, 
    { id: 2, name: 'Build 32' }, 
    { id: 3, name: 'Build 13' }, 
    { id: 4, name: 'Build 24' },
    { id: 5, name: 'Build 5' },
    { id: 6, name: 'Build 56' }
]

let sortedBuilds = builds.sort((n1, n2) => {
  return naturalCompare(n1.name, n2.name)
})

console.log('Sorted by name property')
console.log(sortedBuilds)

คำตอบ #6

วิธีที่ง่ายที่สุดดูเหมือนจะเป็นการลบตัวเลขที่สองออกจากตัวเลขแรก:

var numericArray:Array<number> = [2,3,4,1,5,8,11];

var sortedArray:Array<number> = numericArray.sort((n1,n2) => n1 - n2);

https://alligator.io/js/array-sort-numbers/

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