Bruno God
Bruno God

Reputation: 137

Sort array of object by key

So I have this array of objects

[
  {
    '1485958472927784961': {
      name: 'bruno fiverr',
      points: 6,
      user_id: '1485958472927784961',
      tweets: [Array]
    },
    '1414575563323420679': {
      name: 'ju',
      points: 7,
      user_id: '1414575563323420679',
      tweets: [Array]
    }
  }
]

and I would like to sort this array by the number of points the user has. I am trying to get it working using array.sort with the following function:

var top10 = array.sort(function(a, b) { return a.points > b.points ? 1 : -1; }).slice(0, 10);

but all I get is the same array from start. is that possible?

Upvotes: 2

Views: 6708

Answers (2)

skara9
skara9

Reputation: 4194

You have an array with a single object whose values you want to sort by a property. For that you'll want to:

  1. Access the first object in the outer array with array[0]
  2. Extract the values of the object as an array with Object.values
  3. Sort the values in descending order with the sort function (a,b) => b.points - a.points
  4. Obtain your 10 elements with .slice(0,10)

const array = [
  {
    '1485958472927784961': {
      name: 'bruno fiverr',
      points: 6,
      user_id: '1485958472927784961',
      tweets: [Array]
    },
    '1414575563323420679': {
      name: 'ju',
      points: 7,
      user_id: '1414575563323420679',
      tweets: [Array]
    }
  }
];

const top10 = Object.values(array[0]).sort((a,b) => b.points - a.points).slice(0,10);

console.log(top10);

Upvotes: 2

Steve
Steve

Reputation: 5005

The outermost array is useless here. I would change your data structure to an object with key-values:

const data = {
  '1485958472927784961': {
    name: 'bruno fiverr',
    points: 6,
    user_id: '1485958472927784961',
    tweets: [],
  },
  '1414575563323420679': {
    name: 'ju',
    points: 7,
    user_id: '1414575563323420679',
    tweets: [],
  },
};

From this you can just get all the values which becomes an array of the objects, then run a sort on that.

const data = {
  '1485958472927784961': {
    name: 'bruno fiverr',
    points: 6,
    user_id: '1485958472927784961',
    tweets: []
  },
  '1414575563323420679': {
    name: 'ju',
    points: 7,
    user_id: '1414575563323420679',
    tweets: []
  }
}

const sorted = Object.values(data).sort(function(a, b) {
  return a.points > b.points ? 1 : -1;
}).slice(0, 10);

console.log(sorted)

Upvotes: 1

Related Questions