sort an array by a boolean property in typescript

Viewed 1102

I am using angular 10 and I was wondering how can I sort this array

var dic = [
  { state: false, id: 1 },
  { state: true, id: 2} ,
  { state: false, id: 3 },
  { state: true, id: 4 },
  { state: false, id: 5 }
]

I want to sort by the value of the boolean state, so the result goes this way:

[
  { state: true, id: 2 },
  { state: true, id: 4 },
  { state: false, id: 1 },
  { state: false, id: 3 },
  { state: false, id: 5 }
]

The true value goes first in the array.

What property or something from typescript I have to use to do that?

Thank you!

3 Answers

You can do this using Array#sort by converting the boolean values of state:

Number(true) //1
Number(false) //0

const dic = [
  { state: false, id: 1 },
  { state: true, id: 2 },
  { state: false, id: 3 },
  { state: true, id: 4 },
  { state: false, id: 5 }
];

dic.sort(({ state: stateA = false }, { state: stateB = false }) =>
  Number(stateB) - Number(stateA)
);

console.log(dic);

You can complete it by doing simplify like this.

dic.sort((a, b) => b.state - a.state);

Explain:

We all know that:

false // 0
true // 1

So

false - true // -1
true - false // 1
true - true // 0
false - false // 0

Demo

const dic = [
  { state: false, id: 1 },
  { state: true, id: 2 },
  { state: false, id: 3 },
  { state: true, id: 4 },
  { state: false, id: 5 }
];

dic.sort((a, b) => b.state - a.state);

console.log(dic);

You can sort by the state by casting the boolean to an integer value of 1 or 0 by appending a double-bang (!!) or double-tilde (~~). If the result is 0, move onto the id values.

const dic = [
  { state: false  , id: 1 },
  { state: true   , id: 2 },
  { state: false  , id: 3 },
  { state: true   , id: 4 },
  { state: false  , id: 5 }
];

dic.sort(({ state: stateA, id: idA }, { state: stateB, id: idB }) =>
  (!!stateB - !!stateA) || (idA - idB));

console.log(dic);
.as-console-wrapper { top: 0; max-height: 100% !important; }

Alternatively:

(~~stateB - ~~stateA) || (idA - idB)
Related