11function max ( ) {
22 // http://kevin.vanzonneveld.net
33 // + original by: Onno Marsman
4+ // + revised by: Onno Marsman
45 // % note: Long code cause we're aiming for maximum PHP compatibility
56 // % note: Example 3 doesn't give the expected output yet
67 // * example 1: max(1, 3, 5, 6, 7);
@@ -16,42 +17,89 @@ function max() {
1617 // * example 6: max([2, 4, 8], [2, 5, 7]);
1718 // * returns 6: [2, 5, 7]
1819
19- var ar , retVal = - Infinity ;
20+ var ar , retVal , i = 0 ;
21+
22+ var _obj2Array = function ( obj ) {
23+ if ( obj instanceof Array ) {
24+ return obj ;
25+ } else {
26+ var ar = [ ] ;
27+ for ( var i in obj ) {
28+ ar . push ( obj [ i ] ) ;
29+ }
30+ return ar ;
31+ }
32+ }
33+
34+ var _compare = function ( current , next ) {
35+ if ( current === next ) {
36+ return 0 ;
37+ } else if ( typeof current == 'object' ) {
38+ if ( typeof next == 'object' ) {
39+ current = _obj2Array ( current ) ;
40+ next = _obj2Array ( next ) ;
41+ if ( next . length > current . length ) {
42+ return 1 ;
43+ } else if ( next . length < current . length ) {
44+ return - 1 ;
45+ } else {
46+ var tmp ;
47+ for ( var i = 0 , n = current . length ; i < n ; ++ i ) {
48+ tmp = _compare ( current [ i ] , next [ i ] ) ;
49+ if ( tmp == 1 ) {
50+ return 1 ;
51+ } else if ( tmp == - 1 ) {
52+ return - 1 ;
53+ }
54+ }
55+ return 0 ;
56+ }
57+ } else {
58+ return - 1 ;
59+ }
60+ } else if ( typeof next == 'object' ) {
61+ return 1 ;
62+ } else if ( isNaN ( next ) && ! isNaN ( current ) ) {
63+ if ( current == 0 ) {
64+ return 0 ;
65+ } else {
66+ return ( current < 0 ? 1 : - 1 ) ;
67+ }
68+ } else if ( isNaN ( current ) && ! isNaN ( next ) ) {
69+ if ( next == 0 ) {
70+ return 0 ;
71+ } else {
72+ return ( next > 0 ? 1 : - 1 ) ;
73+ }
74+ } else {
75+ if ( next == current ) {
76+ return 0 ;
77+ } else {
78+ return ( next > current ? 1 : - 1 ) ;
79+ }
80+ }
81+ }
2082
21- if ( arguments . length == 0 ) {
22- throw new Error ( 'Atleast one value should be passed to max()' ) ;
23- } else if ( arguments . length == 1 ) {
24- if ( arguments [ 0 ] instanceof Array ) {
25- ar = arguments [ 0 ] ;
26- } else if ( typeof arguments [ 0 ] == 'object' ) {
27- ar = [ ] ;
28- for ( var i in arguments [ 0 ] ) {
29- ar . push ( ar [ i ] ) ;
30- }
31- } else {
32- throw new Error ( 'Wrong parameter count for max()' ) ;
33- }
34- if ( ar . length == 0 ) {
35- throw new Error ( 'Array must contain at least one element for max()' ) ;
36- }
83+ if ( arguments . length == 0 ) {
84+ throw new Error ( 'At least one value should be passed to max()' ) ;
85+ } else if ( arguments . length == 1 ) {
86+ if ( typeof arguments [ 0 ] == 'object' ) {
87+ ar = _obj2Array ( arguments [ 0 ] ) ;
88+ } else {
89+ throw new Error ( 'Wrong parameter count for max()' ) ;
90+ }
91+ if ( ar . length == 0 ) {
92+ throw new Error ( 'Array must contain at least one element for max()' ) ;
93+ }
3794 } else {
3895 ar = arguments ;
3996 }
4097
41- for ( var i = 0 , n = ar . length ; i < n ; ++ i ) {
42- if ( retVal == Infinity ) {
43- retVal = ar [ i ] ;
44- } else if ( isNaN ( ar [ i ] ) && ! isNaN ( retVal ) ) {
45- if ( retVal <= 0 ) {
46- retVal = ar [ i ] ;
47- }
48- } else if ( isNaN ( retVal ) && ! isNaN ( ar [ i ] ) ) {
49- if ( ar [ i ] > 0 ) {
50- retVal = ar [ i ] ;
51- }
52- } else if ( ar [ i ] > retVal ) {
98+ retVal = ar [ 0 ] ;
99+ for ( i = 1 , n = ar . length ; i < n ; ++ i ) {
100+ if ( _compare ( retVal , ar [ i ] ) == 1 ) {
53101 retVal = ar [ i ] ;
54- }
102+ }
55103 }
56104
57105 return retVal ;
0 commit comments