Sort an array of objects by multiple properties

14,630

(Updated) Here's the answer of question you mentioned in comment.

a.sort(function(a, b) {
  if (a.dnf != b.dnf) {
    return a.dnf ? 1 : -1;
  }
  if (!(a.dnf && b.dnf) && a.isCut != b.isCut) {
    return a.isCut ? 1 : -1;
  }
  if (a.score != b.score) {
    return b.score - a.score; // descending
  }
  return b.id - a.id; // descending
});

Result:

[
  {"id":4,"score":4,"isCut":false,"dnf":false},   // the rest: order by score, id
  {"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}, // isCut: order by score, id
  {"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},   // dnf: order by score, id
  {"id":12,"score":-2,"isCut":false,"dnf":true} //
]
Share:
14,630
Gerstmann
Author by

Gerstmann

Updated on June 26, 2022

Comments

  • Gerstmann
    Gerstmann about 2 years

    I have an array of objects like this:

    var a = [
        { 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 }
    ];
    

    I need to group and sort the array by the following criteria:

    1. if dnf is true, object goes to bottom; all dnf-objects should be sorted by score
    2. if isCut is true, object goes to bottom, but above dnfs; all isCut-objects should be sorted by score
    3. rest should be sorted by score, and if the scores are equal, by id