Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

เรียงอาร์เรย์ออบเจกต์ตามหลาย property ใน JavaScript


สมมติว่าเรามีอาร์เรย์ของออบเจกต์ดังนี้

const arr = [ 
  { id: 1, score: 1, isCut: false, dnf: false }, 
  { id: 2, score: 2, isCut: false, dnf: false }, 
  { id: 3, score: 3, isCut: false, dnf: false }, 
  { id: 4, score: 4, isCut: false, dnf: false }, 
  { id: 5, score: 5, isCut: true, dnf: true }, 
  { id: 6, score: 6, isCut: true, dnf: false }, 
  { id: 7, score: 7, isCut: true, dnf: false }, 
  { id: 8, score: 8, isCut: true, dnf: false }, 
  { id: 9, score: 9, isCut: true, dnf: false }, 
  { id: 10, score: 0, isCut: false, dnf: false }, 
  { id: 11, score: -1, isCut: false, dnf: false }, 
  { id: 12, score: -2, isCut: false, dnf: true }, 
  { id: 13, score: -3, isCut: false, dnf: false }, 
  { id: 14, score: -4, isCut: false, dnf: false }, 
  { id: 15, score: -5, isCut: false, dnf: false }, 
  { id: 16, score: 10, isCut: true, dnf: false } 
];

เราต้องเรียงอาร์เรย์ข้างต้นตามเกณฑ์ต่อไปนี้

ถ้า dnf เป็น true

object ไปด้านล่างสุด; ทุก dnf-objects ควรเรียงตาม score

ถ้า isCut เป็น true

object ไปด้านล่าง แต่เหนือ dnfs; ทุก isCut-objects ควรเรียงตาม score

ส่วนที่เหลือควรเรียงตาม score และถ้าคะแนนเท่ากัน ให้เรียงตาม id

ตัวอย่างโค้ด

โค้ดสำหรับการทำงานนี้จะเป็นดังนี้

const arr = [ 
  { id: 1, score: 1, isCut: false, dnf: false }, 
  { id: 2, score: 2, isCut: false, dnf: false }, 
  { id: 3, score: 3, isCut: false, dnf: false }, 
  { id: 4, score: 4, isCut: false, dnf: false }, 
  { id: 5, score: 5, isCut: true, dnf: true }, 
  { id: 6, score: 6, isCut: true, dnf: false }, 
  { id: 7, score: 7, isCut: true, dnf: false }, 
  { id: 8, score: 8, isCut: true, dnf: false }, 
  { id: 9, score: 9, isCut: true, dnf: false }, 
  { id: 10, score: 0, isCut: false, dnf: false }, 
  { id: 11, score: -1, isCut: false, dnf: false }, 
  { id: 12, score: -2, isCut: false, dnf: true }, 
  { id: 13, score: -3, isCut: false, dnf: false }, 
  { id: 14, score: -4, isCut: false, dnf: false }, 
  { id: 15, score: -5, isCut: false, dnf: false }, 
  { id: 16, score: 10, isCut: true, dnf: false } 
]; 
const sortComplex = (arr = []) => { 
  arr.sort(function (a, b) { 
    const order = (dnf, isCut) => { 
      return [0, 1, 3, 2][dnf * 2 + isCut]; 
    } 
    return order(a.dnf, a.isCut) - order(b.dnf, b.isCut) || b.score - a.score; 
  }); 
}; 
sortComplex(arr); 
console.log(arr);

ผลลัพธ์

ผลลัพธ์ในคอนโซลจะเป็นดังนี้

[ 
  { id: 4, score: 4, isCut: false, dnf: false }, 
  { id: 3, score: 3, isCut: false, dnf: false }, 
  { id: 2, score: 2, isCut: false, dnf: false }, 
  { id: 1, score: 1, isCut: false, dnf: false }, 
  { id: 10, score: 0, isCut: false, dnf: false }, 
  { id: 11, score: -1, isCut: false, dnf: false }, 
  { id: 13, score: -3, isCut: false, dnf: false }, 
  { id: 14, score: -4, isCut: false, dnf: false }, 
  { id: 15, score: -5, isCut: false, dnf: false }, 
  { id: 16, score: 10, isCut: true, dnf: false }, 
  { id: 9, score: 9, isCut: true, dnf: false }, 
  { id: 8, score: 8, isCut: true, dnf: false }, 
  { id: 7, score: 7, isCut: true, dnf: false }, 
  { id: 6, score: 6, isCut: true, dnf: false }, 
  { id: 5, score: 5, isCut: true, dnf: true }, 
  { id: 12, score: -2, isCut: false, dnf: true } 
]