Syntax error Sort an array of objects by multiple properties in JavaScript

Sort an array of objects by multiple properties in JavaScript



Suppose, we have an array of objects like this −

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 }
];

We are required to sort the above array on the following criteria −

If dnf is true,

object goes to bottom; all dnf-objects should be sorted by score

If issue is true,

object goes to bottom, but above dnfs; all isCut-objects should be sorted by score

Rest should be sorted by score, and if the scores are equal, by id

Example

The code for this will be −

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);

Output

And the output in the console will be −

[
   { 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 }
]
Updated on: 2020-11-24T09:49:23+05:30

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements