Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Object filter by N highest numeric values (of keys)

Tags:

javascript

Demo Object:

var foo = {a:1, b:2, c:3, d:4, e:5, f:6, g:7}

Wanted result: (get top 3 keys by value)

{e:5, f:6, g:7}

Explanation:

For a given key/value basic object, how would you get the 3 top values, but not just the values but also the keys? keys could be anything. lets say values are integers.

performance should be in mind.

like image 567
vsync Avatar asked Dec 11 '22 21:12

vsync


2 Answers

You can extract the properties into an array, then sort the array:

var foo = {a:1, b:2, c:3, d:4, e:5, f:6, g:7}
var props = Object.keys(foo).map(function(key) {
  return { key: key, value: this[key] };
}, foo);
props.sort(function(p1, p2) { return p2.value - p1.value; });
var topThree = props.slice(0, 3);

If you want the result as an object, just reduce it back to one

var topThreeObj = props.slice(0, 3).reduce(function(obj, prop) {
  obj[prop.key] = prop.value;
  return obj;
}, {});
like image 166
Pointy Avatar answered Dec 29 '22 15:12

Pointy


Get key/value pairs:

let pairs = Object.entries(foo);

Sort them:

pairs.sort((a, b) => a[1] - b[1]);

Turn some back into an object:

let result = Object.fromEntries(pairs.slice(-3));
like image 38
Ry- Avatar answered Dec 29 '22 13:12

Ry-