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

typescript - JavaScript sort() กับ localeCompare() ไม่ทำงานกับพารามิเตอร์ที่ส่งเข้าไป


นี่ค่อนข้างเป็นเรื่องยากสำหรับฉัน ฉันมีฟังก์ชันง่ายๆ นี้ที่จัดเรียงอาร์เรย์ของคอลเล็กชันตามหนึ่งในฟิลด์ของมัน

นี่คือตัวอย่างอาร์เรย์:

"countries": [
    {
        "id": "AW",
        "name": "Aruba",
        "nameeng": "Aruba",
        "capital": "Oranjestad",
        "currency": "AWG",
        "phonecode": "297"
    },
    {
        "id": "BM",
        "name": "Bermuda",
        "nameeng": "Bermuda",
        "capital": "Hamilton",
        "currency": "BMD",
        "phonecode": "1"
    },
    {
        "id": "GR",
        "name": "Ελλάδα",
        "nameeng": "Greece",
        "capital": "Athens",
        "currency": "EUR",
        "phonecode": "30"
    }];

มันดำเนินต่อไปนานกว่านี้ แต่ฉันคิดว่าคุณคงเข้าใจไอเดียแล้ว และนี่คือตัวฟังก์ชัน:

sortArray(source: any[], key) {

    let result = source.sort((a, b) => { 
        return a[String(key)].localeCompare(b[String(key)]); 
    });

    return result;
}

ตอนนี้มาถึงความลึกลับแล้ว ถ้าฉันเรียกใช้ฟังก์ชันแบบนี้:

countries_sorted = sortArray(countries, 'nameeng');

แล้วผลลัพธ์คือความโกลาหล องค์ประกอบของอาเรย์จะถูกส่งกลับมาในลำดับที่ดูเหมือนสุ่ม

อย่างไรก็ตาม หากฉันเขียนชื่อฟิลด์ลงไปในฟังก์ชันโดยตรงแบบนี้:

sortArray(source: any[], key) {
  let key = 'nameeng';
  ...
}

แล้วมันก็ทำงานได้อย่างสมบูรณ์แบบ!

ฉันได้ตรวจสอบมันด้วย console.log() แล้ว พารามิเตอร์ถูกจัดการอย่างถูกต้อง ประเภทเป็น String แต่การเรียงลำดับจะไม่เกิดขึ้นถ้าฉันส่งมันเข้าไป จะเกิดขึ้นก็ต่อเมื่อฉันระบุค่าโดยตรง

Lodash ไม่ใช่วิธีแก้ปัญหาเพราะมันไม่สามารถจัดเรียงอักษรที่มีเครื่องหมายวรรณยุกต์ได้