Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

find max value of a child object

What would be an elegant way to find the max value of a child object in javascript?

Example:

find the max quantity value of this object (here shown as json):

{"density":[
  {"price":1.22837, "quantity":48201},
  {"price":1.39837, "quantity":28201},
  {"price":1.40107, "quantity":127011},
  {"price":1.5174,  "quantity":75221},
  {"price":1.60600, "quantity":53271}
]}

thank you for any advice!

PS: just to clarify: of course i could loop through, but i thought there would be a more elegant way ...

like image 576
haemse Avatar asked Jan 12 '12 17:01

haemse


Video Answer


2 Answers

There is no way other than looping thru, because you need to visit every child in order to see if the quantity parameter is the new max. In other words, the complexity of the problem is O(n). If the children were ordered by quantity, it would be a different story (i.e. just get the first or last child in the list.)

something like the following...

var json = '{"density":[{"price":1.22837,"quantity":48201},{"price":1.39837,"quantity":28201},{"price":1.40107,"quantity":127011},{"price":1.5174,"quantity":75221},{"price":1.60600,"quantity":53271}]}'

var x = JSON.parse(json);
var max = 0;

x.density.forEach(function(item){
    if (item.quantity > max) max = item.quantity;
});

After this runs, max is the max quantity

note you didn't give us correct json, so I tweaked it a bit.

Here is an example -- click run and look in your console http://jsfiddle.net/e3dQe/

like image 23
hvgotcodes Avatar answered Sep 23 '22 13:09

hvgotcodes


There's the reduce method of the Array prototype:

var arr = JSON.parse(objstring)["density"];
var max = arr.reduce(function(a, b) {
   return Math.max(a, b.quantity);
}, 0);

Another solution would be something like

var max = Math.max.apply(null, arr.map(function(item){
   return item["quantity"];
}));

For more "elegant" ways there are functional libraries which provide getter factory functions and more Array methods. A solution with such a library could look like

var max = arr.get("quantity").max();

which would do exactly the same as the above one, but nicer expressed.

like image 107
Bergi Avatar answered Sep 22 '22 13:09

Bergi