4

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!

1

3 Answers 3

4

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

Sign up to request clarification or add additional context in comments.

3 Comments

Yes it works! can you explain in a more detailed way how that works?
You don't need to use Number to convert the boolean value. Just simplify dic.sort((a, b) => b.state - a.state);
Regarding Number, I guess, Typescript wants explicit casting
1

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

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.