@@ -15,13 +15,14 @@ var Lib = require('../../lib');
15
15
var BADNUM = require ( '../../constants/numerical' ) . BADNUM ;
16
16
17
17
module . exports = function autoType ( array , calendar , opts ) {
18
- var convertNumeric = opts . autotypenumbers !== 'strict' ; // compare against strict, just in case autotypenumbers was not provided in opts
19
-
20
18
if ( ! opts . noMultiCategory && multiCategory ( array ) ) return 'multicategory' ;
21
19
if ( moreDates ( array , calendar ) ) return 'date' ;
20
+
21
+ var convertNumeric = opts . autotypenumbers !== 'strict' ; // compare against strict, just in case autotypenumbers was not provided in opts
22
22
if ( category ( array , convertNumeric ) ) return 'category' ;
23
23
if ( linearOK ( array , convertNumeric ) ) return 'linear' ;
24
- else return '-' ;
24
+
25
+ return '-' ;
25
26
} ;
26
27
27
28
function hasTypeNumber ( v , convertNumeric ) {
@@ -30,11 +31,11 @@ function hasTypeNumber(v, convertNumeric) {
30
31
31
32
// is there at least one number in array? If not, we should leave
32
33
// ax.type empty so it can be autoset later
33
- function linearOK ( array , convertNumeric ) {
34
- if ( ! array ) return false ;
34
+ function linearOK ( a , convertNumeric ) {
35
+ var len = a . length ;
35
36
36
- for ( var i = 0 ; i < array . length ; i ++ ) {
37
- if ( hasTypeNumber ( array [ i ] , convertNumeric ) ) return true ;
37
+ for ( var i = 0 ; i < len ; i ++ ) {
38
+ if ( hasTypeNumber ( a [ i ] , convertNumeric ) ) return true ;
38
39
}
39
40
40
41
return false ;
@@ -47,23 +48,31 @@ function linearOK(array, convertNumeric) {
47
48
// numbers and a few dates
48
49
// as with categories, consider DISTINCT values only.
49
50
function moreDates ( a , calendar ) {
50
- // test at most 1000 points, evenly spaced
51
- var inc = Math . max ( 1 , ( a . length - 1 ) / 1000 ) ;
52
- var dcnt = 0 ;
53
- var ncnt = 0 ;
51
+ var len = a . length ;
52
+ if ( ! len ) return false ;
53
+
54
+ var inc = getIncrement ( len ) ;
55
+ var dats = 0 ;
56
+ var nums = 0 ;
54
57
var seen = { } ;
55
58
56
- for ( var i = 0 ; i < a . length ; i += inc ) {
57
- var ai = a [ Math . round ( i ) ] ;
59
+ for ( var f = 0 ; f < len ; f += inc ) {
60
+ var i = Math . round ( f ) ;
61
+ var ai = a [ i ] ;
58
62
var stri = String ( ai ) ;
59
63
if ( seen [ stri ] ) continue ;
60
64
seen [ stri ] = 1 ;
61
65
62
- if ( Lib . isDateTime ( ai , calendar ) ) dcnt += 1 ;
63
- if ( isNumeric ( ai ) ) ncnt += 1 ;
66
+ if ( Lib . isDateTime ( ai , calendar ) ) dats ++ ;
67
+ if ( isNumeric ( ai ) ) nums ++ ;
64
68
}
65
69
66
- return ( dcnt > ncnt * 2 ) ;
70
+ return dats > nums * 2 ;
71
+ }
72
+
73
+ // return increment to test at most 1000 points, evenly spaced
74
+ function getIncrement ( len ) {
75
+ return Math . max ( 1 , ( len - 1 ) / 1000 ) ;
67
76
}
68
77
69
78
// are the (x,y)-values in gd.data mostly text?
@@ -72,10 +81,9 @@ function category(a, convertNumeric) {
72
81
var len = a . length ;
73
82
if ( ! len ) return false ;
74
83
75
- // test at most 1000 points
76
- var inc = Math . max ( 1 , ( len - 1 ) / 1000 ) ;
77
- var curvenums = 0 ;
78
- var curvecats = 0 ;
84
+ var inc = getIncrement ( len ) ;
85
+ var nums = 0 ;
86
+ var cats = 0 ;
79
87
var seen = { } ;
80
88
81
89
for ( var f = 0 ; f < len ; f += inc ) {
@@ -86,12 +94,12 @@ function category(a, convertNumeric) {
86
94
seen [ stri ] = 1 ;
87
95
88
96
var t = typeof ai ;
89
- if ( t === 'boolean' ) curvecats ++ ;
90
- else if ( convertNumeric ? Lib . cleanNumber ( ai ) !== BADNUM : t === 'number' ) curvenums ++ ;
91
- else if ( t === 'string' ) curvecats ++ ;
97
+ if ( t === 'boolean' ) cats ++ ;
98
+ else if ( convertNumeric ? Lib . cleanNumber ( ai ) !== BADNUM : t === 'number' ) nums ++ ;
99
+ else if ( t === 'string' ) cats ++ ;
92
100
}
93
101
94
- return curvecats > curvenums * 2 ;
102
+ return cats > nums * 2 ;
95
103
}
96
104
97
105
// very-loose requirements for multicategory,
0 commit comments