vislite
Version:
灵活、快速、简单的数据可视化交互式跨端前端库
144 lines (142 loc) • 5.32 kB
JavaScript
/*!
* ruler of VISLite JavaScript Library v1.3.0
* git+https://github.com/oi-contrib/VISLite.git
*/
function ruler (maxValue, minValue, num, option) {
if (maxValue < minValue) {
var temp = minValue;
minValue = maxValue;
maxValue = temp;
}
else if (maxValue == minValue) {
return [maxValue];
}
var times100 = (function (_value) {
var _times100_base = (_value < 100 && _value > -100) ? 10 : 0.1;
var _times100 = -1, _tiemsValue = _value;
while (_times100_base == 10 ?
(_tiemsValue >= -100 && _tiemsValue <= 100)
:
(_tiemsValue <= -100 || _tiemsValue >= 100)) {
_times100 += 1;
_tiemsValue *= _times100_base;
}
if (_times100_base == 10) {
return Math.pow(10, _times100);
}
else {
var temp = "0.";
for (var i = 1; i < _times100; i++) {
temp += "0";
}
return +(temp + "1");
}
})(maxValue - minValue);
var distance100_oral = Math.ceil((maxValue - minValue) * times100 / num);
var getResult = function (changValue) {
var distance100 = {
3: 2,
4: 5,
6: 5,
7: 5,
8: 10,
9: 10,
11: 10,
12: 10,
13: 15,
14: 15,
16: 15,
17: 15,
18: 20,
19: 20,
21: 20,
22: 20,
23: 25,
24: 25,
26: 25,
27: 25
}[distance100_oral + changValue] || (distance100_oral + changValue);
var distance = distance100 / times100;
var begin = Math.floor(minValue / distance) * distance;
var rulerArray = [];
rulerArray.push(begin);
for (var index = 1; rulerArray[rulerArray.length - 1] < maxValue; index++) {
rulerArray.push(begin + distance * index);
}
return rulerArray;
};
var rulerArray = getResult(0);
var balanceMax = function () {
var rulerArray_temp = [];
var changeDist = rulerArray[rulerArray.length - 1] - (option === null || option === void 0 ? void 0 : option.max);
for (var index = 0; index < rulerArray.length; index++) {
if (index + 1 < rulerArray.length && rulerArray[index + 1] - changeDist < minValue) ;
else {
rulerArray_temp.push(rulerArray[index] - changeDist);
}
}
return rulerArray_temp;
};
var balanceMin = function () {
var rulerArray_temp = [];
var changeDist = rulerArray[0] - (option === null || option === void 0 ? void 0 : option.min);
for (var index = 0; index < rulerArray.length; index++) {
rulerArray_temp[index] = rulerArray[index] - changeDist;
if (maxValue <= rulerArray_temp[index])
break;
}
return rulerArray_temp;
};
if (option) {
if ('max' in option && 'min' in option && option.max >= maxValue && option.min <= minValue) {
var isAnswer = function () {
if (rulerArray[0] >= option.min && rulerArray[rulerArray.length - 1] <= option.max)
return true;
var rulerArray_max = balanceMax();
if (rulerArray_max[0] >= option.min && rulerArray_max[rulerArray_max.length - 1] <= option.max) {
rulerArray = rulerArray_max;
return true;
}
var rulerArray_min = balanceMin();
if (rulerArray_min[0] >= option.min && rulerArray_min[rulerArray_max.length - 1] <= option.max) {
rulerArray = rulerArray_min;
return true;
}
};
if (isAnswer())
return rulerArray;
for (var changValue = 1; changValue < 100; changValue++) {
rulerArray = getResult(changValue);
if (isAnswer())
return rulerArray;
rulerArray = getResult(-changValue);
if (isAnswer())
return rulerArray;
}
}
if ('max' in option && option.max >= maxValue) {
if (option.max < rulerArray[rulerArray.length - 1]) {
rulerArray = balanceMax();
}
}
else if ('min' in option && option.min <= minValue) {
if (option.min > rulerArray[0]) {
rulerArray = balanceMin();
}
}
}
for (var index = 0; index < rulerArray.length; index++) {
var valStr = rulerArray[index] + "";
if (/\./.test(valStr)) {
if (/9{7,}$/.test(valStr)) {
valStr = valStr.replace(/9{7,}$/, '');
rulerArray[index] = +(valStr.substring(0, valStr.length - 1) + ((+valStr[valStr.length - 1]) + 1));
}
else if (/0{7,}\d$/.test(valStr)) {
rulerArray[index] = +(valStr.replace(/0{7,}\d$/, ''));
}
}
}
return rulerArray;
}
export { ruler as default };