Array.prototype.max and Array.prototype.min

# Xavier MONTILLET (13 years ago)

I think it'd be nice to have Array.prototype.max and Array.prototype.min.

What they would do is this:

Array.prototype.max = function ( f ) { return this.sort( f )[ this.length - 1 ]; }; Array.prototype.min = function ( f ) { return this.sort( f )[ 0 ]; };

Of course, that's not how they would actually be implemented (sorting the whole array to get the max/minimum is ridiculous) but I wrote them that way so that we clearly see the behavior when a function is given as argument: just as with Array.prototype.sort, the function is used instead of < in the comparisons.

Here is a more efficient implementation:

Array.prototype.max = function ( f ) { var max = this[ 0 ]; var i; var l = this.length; var item; if ( f ) { for ( i = 1; i < l; ++i ) { item = this[ i ]; if ( item > max ) { max = item; } } } else { for ( i = 1; i < l; ++i ) { item = this[ i ]; if ( f( item, max ) === 1 ) {// maybe it should be -1... I never remember... max = item; } } } return max; };

# Rick Waldron (13 years ago)

Why add new api surface when this works as is:

Math.max.apply( null, [ 1, 2, 3, 4 ] ); // 4

Math.min.apply( null, [ 1, 2, 3, 4 ] ); // 1

# Xavier MONTILLET (13 years ago)

Because I'm not talking of arrays containing only numbers.

# Andrea Giammarchi (13 years ago)

In that case, you should not even compare tomatoes and potatoes, a side effect you may have when greater or "less than" is used in your example or sort, without any callback to invoke able to compare, could produce: unexpected results.

"a" and "0a" ... who's first here ? [0] and {length:0}, who is max who is min?

etc

# Xavier MONTILLET (13 years ago)

I mistyped. I wrote "if ( f ) {" instead of "if ( ! f ) {" So when I compare objects with a function, I'm in the "else" part and I check "if f( item, max ) == 1" instead of "if item < max".

Array.prototype.max = function ( f ) { var max = this[ 0 ]; var i; var l = this.length; var item; if ( ! f ) {// @@@ I only changed this line @@@ for ( i = 1; i < l; ++i ) { item = this[ i ]; if ( item > max ) { max = item; } } } else { for ( i = 1; i < l; ++i ) { item = this[ i ]; if ( f( item, max ) === 1 ) {// maybe it should be -1... I never remember... max = item; } } } return max; };

Here's a simple example:

var array = [ { v: 1 }, { v: 3 }, { v: 2 } ]; array.max( function ( a, b ) { return a.v - b.v; } );