Home > Mobile >  Sorting keys of an object not working as expected- Javascript
Sorting keys of an object not working as expected- Javascript

Time:03-04

I'm sorting the keys in the object:

My object:

data = {AAA: 1, BBB: 2, CCC: 55, VVV: 33, FFF:44}

I'm using the following code to sort:

Object.fromEntries(Object.entries(data).sort(([,v1], [,v2]) =>  v2 -  v1))

however it outputs:

{CCC: 55, FFF: 44, VVV: 33, BBB: 2, AAA: 1}

I want to sort the keys in the object which should result:

{AAA: 1, BBB: 2, CCC: 55, FFF: 44, VVV: 33}

and if I try to change the sorting order, still gives results based on the count and not based on the key:

Object.fromEntries(Object.entries(data).sort(([,v1], [,v2]) =>  v1 -  v2))

how can I make the above code work for both sorting value and sorting keys of an object?

CodePudding user response:

That is because you are sorting based on the value of the entries, not the key of the entries. Object.entries() returns a tuple in the following format: [key, value], yet you are only accessing and comparing the values as you are using [, v1] and [, v2]. Change these to [k1] and [k2] respectively (the name doesn't matter, it's the positional argument you're unpacking that matters).

Simply update your accessors to use the first entry in the tuple, which is the key, and use String.prototype.localeCompare:

Object.fromEntries(Object.entries(data).sort(([k1], [k2]) => k1.localeCompare(k2)))

See proof-of-concept below:

const data = {
  AAA: 1,
  BBB: 2,
  CCC: 55,
  VVV: 33,
  FFF: 44
};

console.log(Object.fromEntries(Object.entries(data).sort(([k1], [k2]) => k1.localeCompare(k2))));

CodePudding user response:

const data = {
  AAA: 1,
  BBB: 2,
  CCC: 55,
  VVV: 33,
  FFF: 44
};

console.log(Object.fromEntries(Object.entries(data).sort(([k1], [k2]) => k1.localeCompare(k2))));

CodePudding user response:

Can do it using reduce.

const data = {
  AAA: 1,
  BBB: 2,
  CCC: 55,
  VVV: 33,
  FFF: 44
};
const sorted = Object.keys(data)
  .sort()
  .reduce((obj, key) => {
    obj[key] = data[key];
    return obj;
  }, {});
console.log(sorted);

  • Related