Skip to content

Commit dd6e007

Browse files
benmccannetimberg
authored andcommitted
Add helpers.math._factorize (#6360)
* Add helpers.math._factorize * Remove duplicate test statement
1 parent fb3d6ab commit dd6e007

File tree

4 files changed

+60
-8
lines changed

4 files changed

+60
-8
lines changed

src/helpers/helpers.math.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use strict';
2+
3+
/**
4+
* @alias Chart.helpers.math
5+
* @namespace
6+
*/
7+
var exports = {
8+
/**
9+
* Returns an array of factors sorted from 1 to sqrt(value)
10+
* @private
11+
*/
12+
_factorize: function(value) {
13+
var result = [];
14+
var sqrt = Math.sqrt(value);
15+
var i;
16+
17+
for (i = 1; i < sqrt; i++) {
18+
if (value % i === 0) {
19+
result.push(i);
20+
result.push(value / i);
21+
}
22+
}
23+
if (sqrt === (sqrt | 0)) { // if value is a square number
24+
result.push(sqrt);
25+
}
26+
27+
result.sort(function(a, b) {
28+
return a - b;
29+
}).pop();
30+
return result;
31+
}
32+
};
33+
34+
module.exports = exports;

src/helpers/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ module.exports = require('./helpers.core');
44
module.exports.easing = require('./helpers.easing');
55
module.exports.canvas = require('./helpers.canvas');
66
module.exports.options = require('./helpers.options');
7+
module.exports.math = require('./helpers.math');

src/scales/scale.time.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var helpers = require('../helpers/index');
66
var Scale = require('../core/core.scale');
77

88
var valueOrDefault = helpers.valueOrDefault;
9+
var factorize = helpers.math._factorize;
910

1011
// Integer constants are from the ES6 spec.
1112
var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;
@@ -15,42 +16,42 @@ var INTERVALS = {
1516
millisecond: {
1617
common: true,
1718
size: 1,
18-
steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]
19+
steps: factorize(1000)
1920
},
2021
second: {
2122
common: true,
2223
size: 1000,
23-
steps: [1, 2, 5, 10, 15, 30]
24+
steps: factorize(60)
2425
},
2526
minute: {
2627
common: true,
2728
size: 60000,
28-
steps: [1, 2, 5, 10, 15, 30]
29+
steps: factorize(60)
2930
},
3031
hour: {
3132
common: true,
3233
size: 3600000,
33-
steps: [1, 2, 3, 6, 12]
34+
steps: factorize(24)
3435
},
3536
day: {
3637
common: true,
3738
size: 86400000,
38-
steps: [1, 2, 5]
39+
steps: factorize(10)
3940
},
4041
week: {
4142
common: false,
4243
size: 604800000,
43-
steps: [1, 2, 3, 4]
44+
steps: factorize(4)
4445
},
4546
month: {
4647
common: true,
4748
size: 2.628e9,
48-
steps: [1, 2, 3]
49+
steps: factorize(12)
4950
},
5051
quarter: {
5152
common: false,
5253
size: 7.884e9,
53-
steps: [1, 2, 3, 4]
54+
steps: factorize(4)
5455
},
5556
year: {
5657
common: true,

test/specs/helpers.math.tests.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
3+
describe('Chart.helpers.math', function() {
4+
var factorize = Chart.helpers.math._factorize;
5+
6+
it('should factorize', function() {
7+
expect(factorize(1000)).toEqual([1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500]);
8+
expect(factorize(60)).toEqual([1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30]);
9+
expect(factorize(30)).toEqual([1, 2, 3, 5, 6, 10, 15]);
10+
expect(factorize(24)).toEqual([1, 2, 3, 4, 6, 8, 12]);
11+
expect(factorize(12)).toEqual([1, 2, 3, 4, 6]);
12+
expect(factorize(4)).toEqual([1, 2]);
13+
expect(factorize(-1)).toEqual([]);
14+
expect(factorize(2.76)).toEqual([]);
15+
});
16+
});

0 commit comments

Comments
 (0)