Blame view

天文台pc/tianwentai-ui/node_modules/recharts/es6/util/DataUtils.js 3.75 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  import isString from 'lodash/isString';
  import isNan from 'lodash/isNaN';
  import get from 'lodash/get';
  import lodashIsNumber from 'lodash/isNumber';
  export var mathSign = function mathSign(value) {
    if (value === 0) {
      return 0;
    }
    if (value > 0) {
      return 1;
    }
    return -1;
  };
  export var isPercent = function isPercent(value) {
    return isString(value) && value.indexOf('%') === value.length - 1;
  };
  export var isNumber = function isNumber(value) {
    return lodashIsNumber(value) && !isNan(value);
  };
  export var isNumOrStr = function isNumOrStr(value) {
    return isNumber(value) || isString(value);
  };
  var idCounter = 0;
  export var uniqueId = function uniqueId(prefix) {
    var id = ++idCounter;
    return "".concat(prefix || '').concat(id);
  };
  
  /**
   * Get percent value of a total value
   * @param {number|string} percent A percent
   * @param {number} totalValue     Total value
   * @param {number} defaultValue   The value returned when percent is undefined or invalid
   * @param {boolean} validate      If set to be true, the result will be validated
   * @return {number} value
   */
  export var getPercentValue = function getPercentValue(percent, totalValue) {
    var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
    var validate = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
    if (!isNumber(percent) && !isString(percent)) {
      return defaultValue;
    }
    var value;
    if (isPercent(percent)) {
      var index = percent.indexOf('%');
      value = totalValue * parseFloat(percent.slice(0, index)) / 100;
    } else {
      value = +percent;
    }
    if (isNan(value)) {
      value = defaultValue;
    }
    if (validate && value > totalValue) {
      value = totalValue;
    }
    return value;
  };
  export var getAnyElementOfObject = function getAnyElementOfObject(obj) {
    if (!obj) {
      return null;
    }
    var keys = Object.keys(obj);
    if (keys && keys.length) {
      return obj[keys[0]];
    }
    return null;
  };
  export var hasDuplicate = function hasDuplicate(ary) {
    if (!Array.isArray(ary)) {
      return false;
    }
    var len = ary.length;
    var cache = {};
    for (var i = 0; i < len; i++) {
      if (!cache[ary[i]]) {
        cache[ary[i]] = true;
      } else {
        return true;
      }
    }
    return false;
  };
  
  /* @todo consider to rename this function into `getInterpolator` */
  export var interpolateNumber = function interpolateNumber(numberA, numberB) {
    if (isNumber(numberA) && isNumber(numberB)) {
      return function (t) {
        return numberA + t * (numberB - numberA);
      };
    }
    return function () {
      return numberB;
    };
  };
  export function findEntryInArray(ary, specifiedKey, specifiedValue) {
    if (!ary || !ary.length) {
      return null;
    }
    return ary.find(function (entry) {
      return entry && (typeof specifiedKey === 'function' ? specifiedKey(entry) : get(entry, specifiedKey)) === specifiedValue;
    });
  }
  
  /**
   * The least square linear regression
   * @param {Array} data The array of points
   * @returns {Object} The domain of x, and the parameter of linear function
   */
  export var getLinearRegression = function getLinearRegression(data) {
    if (!data || !data.length) {
      return null;
    }
    var len = data.length;
    var xsum = 0;
    var ysum = 0;
    var xysum = 0;
    var xxsum = 0;
    var xmin = Infinity;
    var xmax = -Infinity;
    var xcurrent = 0;
    var ycurrent = 0;
    for (var i = 0; i < len; i++) {
      xcurrent = data[i].cx || 0;
      ycurrent = data[i].cy || 0;
      xsum += xcurrent;
      ysum += ycurrent;
      xysum += xcurrent * ycurrent;
      xxsum += xcurrent * xcurrent;
      xmin = Math.min(xmin, xcurrent);
      xmax = Math.max(xmax, xcurrent);
    }
    var a = len * xxsum !== xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0;
    return {
      xmin: xmin,
      xmax: xmax,
      a: a,
      b: (ysum - a * xsum) / len
    };
  };