Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fast way to get the min/max values among properties of object

I have an object in javascript like this:

{ "a":4, "b":0.5 , "c":0.35, "d":5 } 

Is there a fast way to get the minimum and maximum value among the properties without having to loop through them all? because the object I have is huge and I need to get the min/max value every two seconds. (The values of the object keeps changing).

like image 283
Y2theZ Avatar asked Jun 21 '12 16:06

Y2theZ


People also ask

How do you find the maximum and minimum of an array of objects?

Using map(), Math, and the spread operator map() function, we take all of our Y values and insert them into a new Array of Numbers. Now that we have a simple Array of numbers, we use Math. min() or Math. max() to return the min/max values from our new Y value array.

How do you iterate over an object in Javascript?

There are two methods to iterate over an object which are discussed below: Method 1: Using for…in loop: The properties of the object can be iterated over using a for..in loop. This loop is used to iterate over all non-Symbol iterable properties of an object.


2 Answers

Update: Modern version (ES6+)

let obj = { a: 4, b: 0.5 , c: 0.35, d: 5 };  let arr = Object.values(obj); let min = Math.min(...arr); let max = Math.max(...arr);  console.log( `Min value: ${min}, max value: ${max}` );

Original Answer:

Try this:

let obj = { a: 4, b: 0.5 , c: 0.35, d: 5 }; var arr = Object.keys( obj ).map(function ( key ) { return obj[key]; }); 

and then:

var min = Math.min.apply( null, arr ); var max = Math.max.apply( null, arr ); 

Live demo: http://jsfiddle.net/7GCu7/1/

like image 194
Šime Vidas Avatar answered Oct 13 '22 00:10

Šime Vidas


There's no way to find the maximum / minimum in the general case without looping through all the n elements (if you go from, 1 to n-1, how do you know whether the element n isn't larger (or smaller) than the current max/min)?

You mentioned that the values change every couple of seconds. If you know exactly which values change, you can start with your previous max/min values, and only compare with the new ones, but even in this case, if one of the values which were modified was your old max/min, you may need to loop through them again.

Another alternative - again, only if the number of values which change are small - would be to store the values in a structure such as a tree or a heap, and as the new values arrive you'd insert (or update) them appropriately. But whether you can do that is not clear based on your question.

If you want to get the maximum / minimum element of a given list while looping through all elements, then you can use something like the snippet below, but you will not be able to do that without going through all of them

var list = { "a":4, "b":0.5 , "c":0.35, "d":5 }; var keys = Object.keys(list); var min = list[keys[0]]; // ignoring case of empty list for conciseness var max = list[keys[0]]; var i;  for (i = 1; i < keys.length; i++) {     var value = list[keys[i]];     if (value < min) min = value;     if (value > max) max = value; } 
like image 24
carlosfigueira Avatar answered Oct 13 '22 00:10

carlosfigueira