From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 2 Jul 2019 22:22:47 +0000 (-0700) Subject: Add helpers.math._factorize (#6360) X-Git-Tag: v2.9.0~1^2~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd6e007ac1476cc16f26e70a288c6ac65178bcac;p=thirdparty%2FChart.js.git Add helpers.math._factorize (#6360) * Add helpers.math._factorize * Remove duplicate test statement --- diff --git a/src/helpers/helpers.math.js b/src/helpers/helpers.math.js new file mode 100644 index 000000000..9ed8114ea --- /dev/null +++ b/src/helpers/helpers.math.js @@ -0,0 +1,34 @@ +'use strict'; + +/** + * @alias Chart.helpers.math + * @namespace + */ +var exports = { + /** + * Returns an array of factors sorted from 1 to sqrt(value) + * @private + */ + _factorize: function(value) { + var result = []; + var sqrt = Math.sqrt(value); + var i; + + for (i = 1; i < sqrt; i++) { + if (value % i === 0) { + result.push(i); + result.push(value / i); + } + } + if (sqrt === (sqrt | 0)) { // if value is a square number + result.push(sqrt); + } + + result.sort(function(a, b) { + return a - b; + }).pop(); + return result; + } +}; + +module.exports = exports; diff --git a/src/helpers/index.js b/src/helpers/index.js index 60c199cad..ef5100760 100644 --- a/src/helpers/index.js +++ b/src/helpers/index.js @@ -4,3 +4,4 @@ module.exports = require('./helpers.core'); module.exports.easing = require('./helpers.easing'); module.exports.canvas = require('./helpers.canvas'); module.exports.options = require('./helpers.options'); +module.exports.math = require('./helpers.math'); diff --git a/src/scales/scale.time.js b/src/scales/scale.time.js index 0f6348bc4..88ccdf7a2 100644 --- a/src/scales/scale.time.js +++ b/src/scales/scale.time.js @@ -6,6 +6,7 @@ var helpers = require('../helpers/index'); var Scale = require('../core/core.scale'); var valueOrDefault = helpers.valueOrDefault; +var factorize = helpers.math._factorize; // Integer constants are from the ES6 spec. var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; @@ -15,42 +16,42 @@ var INTERVALS = { millisecond: { common: true, size: 1, - steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + steps: factorize(1000) }, second: { common: true, size: 1000, - steps: [1, 2, 5, 10, 15, 30] + steps: factorize(60) }, minute: { common: true, size: 60000, - steps: [1, 2, 5, 10, 15, 30] + steps: factorize(60) }, hour: { common: true, size: 3600000, - steps: [1, 2, 3, 6, 12] + steps: factorize(24) }, day: { common: true, size: 86400000, - steps: [1, 2, 5] + steps: factorize(10) }, week: { common: false, size: 604800000, - steps: [1, 2, 3, 4] + steps: factorize(4) }, month: { common: true, size: 2.628e9, - steps: [1, 2, 3] + steps: factorize(12) }, quarter: { common: false, size: 7.884e9, - steps: [1, 2, 3, 4] + steps: factorize(4) }, year: { common: true, diff --git a/test/specs/helpers.math.tests.js b/test/specs/helpers.math.tests.js new file mode 100644 index 000000000..c26435f65 --- /dev/null +++ b/test/specs/helpers.math.tests.js @@ -0,0 +1,16 @@ +'use strict'; + +describe('Chart.helpers.math', function() { + var factorize = Chart.helpers.math._factorize; + + it('should factorize', function() { + expect(factorize(1000)).toEqual([1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500]); + expect(factorize(60)).toEqual([1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30]); + expect(factorize(30)).toEqual([1, 2, 3, 5, 6, 10, 15]); + expect(factorize(24)).toEqual([1, 2, 3, 4, 6, 8, 12]); + expect(factorize(12)).toEqual([1, 2, 3, 4, 6]); + expect(factorize(4)).toEqual([1, 2]); + expect(factorize(-1)).toEqual([]); + expect(factorize(2.76)).toEqual([]); + }); +});