@ivujs/i-utils 1.1.18 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +96 -30
  2. package/dist/cjs/ID-card/index.cjs +87 -0
  3. package/dist/cjs/array/index.cjs +470 -0
  4. package/dist/cjs/clipboard/index.cjs +128 -0
  5. package/dist/cjs/color/index.cjs +193 -0
  6. package/dist/cjs/constants/date.cjs +178 -0
  7. package/dist/cjs/constants/id-card.cjs +52 -0
  8. package/dist/cjs/constants/keycode.cjs +117 -0
  9. package/dist/cjs/constants/lang.cjs +13 -0
  10. package/dist/cjs/constants/math.cjs +13 -0
  11. package/dist/cjs/constants/regexp.cjs +53 -0
  12. package/dist/cjs/constants/sort.cjs +15 -0
  13. package/dist/cjs/cookie/index.cjs +70 -0
  14. package/dist/cjs/crypto/aes/aes.cjs +480 -0
  15. package/dist/cjs/crypto/aes/index.cjs +27 -0
  16. package/dist/cjs/crypto/base32/base32.cjs +357 -0
  17. package/dist/cjs/crypto/base32/index.cjs +41 -0
  18. package/dist/cjs/crypto/base64/base64.cjs +348 -0
  19. package/dist/cjs/crypto/base64/index.cjs +59 -0
  20. package/dist/cjs/crypto/des/des.cjs +257 -0
  21. package/dist/cjs/crypto/des/index.cjs +28 -0
  22. package/dist/cjs/crypto/md5/index.cjs +24 -0
  23. package/dist/cjs/crypto/md5/md5.cjs +897 -0
  24. package/dist/cjs/crypto/sha/sha1/index.cjs +24 -0
  25. package/dist/cjs/crypto/sha/sha1/sha1.cjs +529 -0
  26. package/dist/cjs/crypto/sha/sha256/index.cjs +43 -0
  27. package/dist/cjs/crypto/sha/sha256/sha256.cjs +595 -0
  28. package/dist/cjs/crypto/sha/sha3/index.cjs +41 -0
  29. package/dist/cjs/crypto/sha/sha3/sha3.cjs +624 -0
  30. package/dist/cjs/crypto/sha/sha512/index.cjs +81 -0
  31. package/dist/cjs/crypto/sha/sha512/sha512.cjs +950 -0
  32. package/dist/cjs/crypto/sm/lib/asn1.cjs +149 -0
  33. package/dist/cjs/crypto/sm/lib/ec.cjs +315 -0
  34. package/dist/cjs/crypto/sm/lib/jsbn.cjs +1608 -0
  35. package/dist/cjs/crypto/sm/lib/sm3.cjs +158 -0
  36. package/dist/cjs/crypto/sm/lib/utils.cjs +170 -0
  37. package/dist/cjs/crypto/sm/sm2/index.cjs +112 -0
  38. package/dist/cjs/crypto/sm/sm2/sm2.cjs +231 -0
  39. package/dist/cjs/crypto/sm/sm3/index.cjs +15 -0
  40. package/dist/cjs/crypto/sm/sm3/sm3.cjs +93 -0
  41. package/dist/cjs/crypto/sm/sm4/index.cjs +27 -0
  42. package/dist/cjs/crypto/sm/sm4/sm4.cjs +327 -0
  43. package/dist/cjs/crypto/tea/index.cjs +25 -0
  44. package/dist/cjs/crypto/tea/tea.cjs +187 -0
  45. package/dist/cjs/date/index.cjs +1266 -0
  46. package/dist/cjs/desensitized/index.cjs +75 -0
  47. package/dist/cjs/device/index.cjs +151 -0
  48. package/dist/cjs/dom/index.cjs +129 -0
  49. package/dist/cjs/file/index.cjs +333 -0
  50. package/dist/cjs/function/index.cjs +69 -0
  51. package/dist/cjs/index.cjs +402 -7
  52. package/dist/cjs/keycode/index.cjs +33 -0
  53. package/dist/cjs/math/index.cjs +278 -0
  54. package/dist/cjs/number/index.cjs +31 -0
  55. package/dist/cjs/object/index.cjs +272 -0
  56. package/dist/cjs/pagination/index.cjs +131 -0
  57. package/dist/cjs/random/index.cjs +24 -0
  58. package/dist/cjs/regexp/index.cjs +100 -0
  59. package/dist/cjs/storage/index.cjs +11 -0
  60. package/dist/cjs/storage/localStorage.cjs +37 -0
  61. package/dist/cjs/storage/sessionStorage.cjs +37 -0
  62. package/dist/cjs/string/index.cjs +358 -0
  63. package/dist/cjs/url/index.cjs +258 -0
  64. package/dist/cjs/validate/index.cjs +468 -0
  65. package/dist/cjs/weapp/index.cjs +142 -0
  66. package/dist/es/ID-card/index.d.ts +31 -0
  67. package/dist/es/ID-card/index.mjs +81 -0
  68. package/dist/es/array/index.d.ts +203 -0
  69. package/dist/es/array/index.mjs +441 -0
  70. package/dist/es/clipboard/index.d.ts +29 -0
  71. package/dist/es/clipboard/index.mjs +122 -0
  72. package/dist/es/color/index.d.ts +52 -0
  73. package/dist/es/color/index.mjs +183 -0
  74. package/dist/es/constants/date.d.ts +174 -0
  75. package/dist/es/constants/date.mjs +176 -0
  76. package/dist/es/constants/id-card.d.ts +43 -0
  77. package/dist/es/constants/id-card.mjs +50 -0
  78. package/dist/es/constants/index.d.ts +7 -0
  79. package/dist/es/constants/keycode.d.ts +103 -0
  80. package/dist/es/constants/keycode.mjs +115 -0
  81. package/dist/es/constants/lang.d.ts +4 -0
  82. package/dist/es/constants/lang.mjs +11 -0
  83. package/dist/es/constants/math.d.ts +4 -0
  84. package/dist/es/constants/math.mjs +11 -0
  85. package/dist/es/constants/regexp.d.ts +24 -0
  86. package/dist/es/constants/regexp.mjs +51 -0
  87. package/dist/es/constants/sort.d.ts +5 -0
  88. package/dist/es/constants/sort.mjs +13 -0
  89. package/dist/es/cookie/index.d.ts +29 -0
  90. package/dist/es/cookie/index.mjs +64 -0
  91. package/dist/es/crypto/aes/aes.d.ts +156 -0
  92. package/dist/es/crypto/aes/aes.mjs +478 -0
  93. package/dist/es/crypto/aes/index.d.ts +16 -0
  94. package/dist/es/crypto/aes/index.mjs +24 -0
  95. package/dist/es/crypto/base32/base32.d.ts +3 -0
  96. package/dist/es/crypto/base32/base32.mjs +353 -0
  97. package/dist/es/crypto/base32/index.d.ts +24 -0
  98. package/dist/es/crypto/base32/index.mjs +36 -0
  99. package/dist/es/crypto/base64/base64.d.ts +5 -0
  100. package/dist/es/crypto/base64/base64.mjs +342 -0
  101. package/dist/es/crypto/base64/index.d.ts +36 -0
  102. package/dist/es/crypto/base64/index.mjs +52 -0
  103. package/dist/es/crypto/des/des.d.ts +52 -0
  104. package/dist/es/crypto/des/des.mjs +255 -0
  105. package/dist/es/crypto/des/index.d.ts +14 -0
  106. package/dist/es/crypto/des/index.mjs +25 -0
  107. package/dist/es/crypto/index.d.ts +8 -0
  108. package/dist/es/crypto/md5/index.d.ts +13 -0
  109. package/dist/es/crypto/md5/index.mjs +21 -0
  110. package/dist/es/crypto/md5/md5.d.ts +144 -0
  111. package/dist/es/crypto/md5/md5.mjs +894 -0
  112. package/dist/es/crypto/sha/index.d.ts +4 -0
  113. package/dist/es/crypto/sha/sha1/index.d.ts +13 -0
  114. package/dist/es/crypto/sha/sha1/index.mjs +21 -0
  115. package/dist/es/crypto/sha/sha1/sha1.d.ts +2 -0
  116. package/dist/es/crypto/sha/sha1/sha1.mjs +526 -0
  117. package/dist/es/crypto/sha/sha256/index.d.ts +26 -0
  118. package/dist/es/crypto/sha/sha256/index.mjs +38 -0
  119. package/dist/es/crypto/sha/sha256/sha256.d.ts +4 -0
  120. package/dist/es/crypto/sha/sha256/sha256.mjs +590 -0
  121. package/dist/es/crypto/sha/sha3/index.d.ts +24 -0
  122. package/dist/es/crypto/sha/sha3/index.mjs +36 -0
  123. package/dist/es/crypto/sha/sha3/sha3.d.ts +4 -0
  124. package/dist/es/crypto/sha/sha3/sha3.mjs +619 -0
  125. package/dist/es/crypto/sha/sha512/index.d.ts +52 -0
  126. package/dist/es/crypto/sha/sha512/index.mjs +72 -0
  127. package/dist/es/crypto/sha/sha512/sha512.d.ts +8 -0
  128. package/dist/es/crypto/sha/sha512/sha512.mjs +941 -0
  129. package/dist/es/crypto/sm/index.d.ts +3 -0
  130. package/dist/es/crypto/sm/lib/asn1.d.ts +12 -0
  131. package/dist/es/crypto/sm/lib/asn1.mjs +146 -0
  132. package/dist/es/crypto/sm/lib/ec.d.ts +126 -0
  133. package/dist/es/crypto/sm/lib/ec.mjs +312 -0
  134. package/dist/es/crypto/sm/lib/jsbn.d.ts +198 -0
  135. package/dist/es/crypto/sm/lib/jsbn.mjs +1605 -0
  136. package/dist/es/crypto/sm/lib/sm3.d.ts +5 -0
  137. package/dist/es/crypto/sm/lib/sm3.mjs +155 -0
  138. package/dist/es/crypto/sm/lib/utils.d.ts +53 -0
  139. package/dist/es/crypto/sm/lib/utils.mjs +158 -0
  140. package/dist/es/crypto/sm/sm2/index.d.ts +71 -0
  141. package/dist/es/crypto/sm/sm2/index.mjs +101 -0
  142. package/dist/es/crypto/sm/sm2/sm2.d.ts +34 -0
  143. package/dist/es/crypto/sm/sm2/sm2.mjs +220 -0
  144. package/dist/es/crypto/sm/sm3/index.d.ts +7 -0
  145. package/dist/es/crypto/sm/sm3/index.mjs +13 -0
  146. package/dist/es/crypto/sm/sm3/sm3.d.ts +1 -0
  147. package/dist/es/crypto/sm/sm3/sm3.mjs +91 -0
  148. package/dist/es/crypto/sm/sm4/index.d.ts +16 -0
  149. package/dist/es/crypto/sm/sm4/index.mjs +24 -0
  150. package/dist/es/crypto/sm/sm4/sm4.d.ts +2 -0
  151. package/dist/es/crypto/sm/sm4/sm4.mjs +324 -0
  152. package/dist/es/crypto/tea/index.d.ts +14 -0
  153. package/dist/es/crypto/tea/index.mjs +22 -0
  154. package/dist/es/crypto/tea/tea.d.ts +69 -0
  155. package/dist/es/crypto/tea/tea.mjs +185 -0
  156. package/dist/es/date/index.d.ts +547 -0
  157. package/dist/es/date/index.mjs +1179 -0
  158. package/dist/es/desensitized/index.d.ts +38 -0
  159. package/dist/es/desensitized/index.mjs +69 -0
  160. package/dist/es/device/index.d.ts +67 -0
  161. package/dist/es/device/index.mjs +137 -0
  162. package/dist/es/dom/index.d.ts +57 -0
  163. package/dist/es/dom/index.mjs +119 -0
  164. package/dist/es/file/index.d.ts +93 -0
  165. package/dist/es/file/index.mjs +317 -0
  166. package/dist/es/function/index.d.ts +23 -0
  167. package/dist/es/function/index.mjs +65 -0
  168. package/dist/es/index.d.ts +26 -1
  169. package/dist/es/index.mjs +57 -4
  170. package/dist/es/keycode/index.d.ts +12 -0
  171. package/dist/es/keycode/index.mjs +30 -0
  172. package/dist/es/math/index.d.ts +66 -0
  173. package/dist/es/math/index.mjs +268 -0
  174. package/dist/es/number/index.d.ts +14 -0
  175. package/dist/es/number/index.mjs +28 -0
  176. package/dist/es/object/index.d.ts +83 -0
  177. package/dist/es/object/index.mjs +259 -0
  178. package/dist/es/pagination/index.d.ts +34 -0
  179. package/dist/es/pagination/index.mjs +125 -0
  180. package/dist/es/random/index.d.ts +15 -0
  181. package/dist/es/random/index.mjs +21 -0
  182. package/dist/es/regexp/index.d.ts +63 -0
  183. package/dist/es/regexp/index.mjs +89 -0
  184. package/dist/es/storage/index.d.ts +7 -0
  185. package/dist/es/storage/index.mjs +9 -0
  186. package/dist/es/storage/localStorage.d.ts +21 -0
  187. package/dist/es/storage/localStorage.mjs +32 -0
  188. package/dist/es/storage/sessionStorage.d.ts +21 -0
  189. package/dist/es/storage/sessionStorage.mjs +32 -0
  190. package/dist/es/string/index.d.ts +121 -0
  191. package/dist/es/string/index.mjs +339 -0
  192. package/dist/es/url/index.d.ts +118 -0
  193. package/dist/es/url/index.mjs +240 -0
  194. package/dist/es/validate/index.d.ts +228 -0
  195. package/dist/es/validate/index.mjs +431 -0
  196. package/dist/es/weapp/index.d.ts +57 -0
  197. package/dist/es/weapp/index.mjs +131 -0
  198. package/dist/index.d.ts +2857 -17
  199. package/dist/lib/index.full.umd.js +14238 -31
  200. package/dist/lib/index.full.umd.min.js +64 -2
  201. package/dist/lib/index.full.umd.min.js.map +1 -1
  202. package/dist/resolver/auto-imports.cjs +337 -1
  203. package/dist/resolver/auto-imports.mjs +337 -1
  204. package/package.json +90 -87
@@ -0,0 +1,268 @@
1
+ import { isNaN } from '../validate/index.mjs';
2
+ import { MATH } from '../constants/math.mjs';
3
+
4
+ /* 数字计算 */
5
+ /**
6
+ * 两个数字相加
7
+ * @param {String|Number} arg1 第一个数字
8
+ * @param {String|Number} arg2 第二个数字
9
+ * @returns {Number} 返回计算后的数字
10
+ */
11
+ function add(arg1, arg2) {
12
+ let r1, r2, m;
13
+ try {
14
+ r1 = arg1.toString().split(".")[1].length;
15
+ }
16
+ catch (e) {
17
+ r1 = 0;
18
+ }
19
+ try {
20
+ r2 = arg2.toString().split(".")[1].length;
21
+ }
22
+ catch (e) {
23
+ r2 = 0;
24
+ }
25
+ m = Math.pow(10, Math.max(r1, r2));
26
+ return (arg1 * m + arg2 * m) / m;
27
+ }
28
+ /**
29
+ * 两个数字相减
30
+ * @param {String|Number} arg1 第一个数字
31
+ * @param {String|Number} arg2 第二个数字
32
+ * @returns {Number} 返回计算后的数字
33
+ */
34
+ function subtract(arg1, arg2) {
35
+ let r1, r2, m, n;
36
+ try {
37
+ r1 = arg1.toString().split(".")[1].length;
38
+ }
39
+ catch (e) {
40
+ r1 = 0;
41
+ }
42
+ try {
43
+ r2 = arg2.toString().split(".")[1].length;
44
+ }
45
+ catch (e) {
46
+ r2 = 0;
47
+ }
48
+ m = Math.pow(10, Math.max(r1, r2));
49
+ n = r1 >= r2 ? r1 : r2;
50
+ return ((arg1 * m - arg2 * m) / m).toFixed(n);
51
+ }
52
+ /**
53
+ * 两个数字相乘
54
+ * @param {String|Number} arg1 第一个数字
55
+ * @param {String|Number} arg2 第二个数字
56
+ * @returns 返回计算后的数字
57
+ */
58
+ function multiply(arg1, arg2) {
59
+ let m = 0, s1 = arg1.toString(), s2 = arg2.toString();
60
+ try {
61
+ m += s1.split(".")[1].length;
62
+ }
63
+ catch (e) { }
64
+ try {
65
+ m += s2.split(".")[1].length;
66
+ }
67
+ catch (e) { }
68
+ return (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) / Math.pow(10, m);
69
+ }
70
+ /**
71
+ * 两个数字相除
72
+ * @param {String|Number} arg1 第一个数字
73
+ * @param {String|Number} arg2 第二个数字
74
+ * @returns {Number} 返回计算后的数字
75
+ */
76
+ function divide(arg1, arg2) {
77
+ let t1 = 0, t2 = 0, r1, r2;
78
+ try {
79
+ t1 = arg1.toString().split(".")[1].length;
80
+ }
81
+ catch (e) { }
82
+ try {
83
+ t2 = arg2.toString().split(".")[1].length;
84
+ }
85
+ catch (e) { }
86
+ r1 = Number(arg1.toString().replace(".", ""));
87
+ r2 = Number(arg2.toString().replace(".", ""));
88
+ return (r1 / r2) * Math.pow(10, t2 - t1);
89
+ }
90
+ /**
91
+ * 两个数字取模
92
+ * @param {String|Number} arg1 第一个数字
93
+ * @param {String|Number} arg2 第二个数字
94
+ * @returns {Number} 返回计算后的数字
95
+ */
96
+ function modulo(arg1, arg2) {
97
+ let t1 = 0, t2 = 0, d = 0;
98
+ try {
99
+ t1 = arg1.toString().split(".")[1].length;
100
+ }
101
+ catch (e) { }
102
+ try {
103
+ t2 = arg2.toString().split(".")[1].length;
104
+ }
105
+ catch (e) { }
106
+ d = Math.pow(10, Math.max(t1, t2));
107
+ return (Math.round(Number(arg1) * d) % Math.round(Number(arg2) * d)) / d;
108
+ }
109
+ /**
110
+ * 最大公约数
111
+ * @param {String|Number} arg1 第一个数字
112
+ * @param {String|Number} arg2 第二个数字
113
+ * @returns {Number} 返回计算后的数字
114
+ */
115
+ function gcd(arg1, arg2) {
116
+ return !arg2 ? arg1 : gcd(arg2, arg1 % arg2);
117
+ }
118
+ /**
119
+ * 最小公倍数
120
+ * @param {String|Number} arg1 第一个数字
121
+ * @param {String|Number} arg2 第二个数字
122
+ * @returns {Number} 返回计算后的数字
123
+ */
124
+ function scm(arg1, arg2) {
125
+ return (arg1 * arg2) / gcd(arg1, arg2);
126
+ }
127
+ /* 数字精度 */
128
+ /**
129
+ * 强制保留小数位数
130
+ * @description 默认保留两位小数,解决原生的toFixed()会五舍六入的问题
131
+ * @param {String|Number} num 数字
132
+ * @param {Number} decimals 保留小数的位数,默认2位
133
+ * @param {Number} mode 保留小数模式
134
+ * @returns {String} 返回保留后的数字字符串
135
+ */
136
+ function toFixed(num, decimals = 2, mode = MATH.ROUND) {
137
+ // 四舍五入
138
+ if (mode === MATH.ROUND) {
139
+ return _toFixedRound(num, decimals);
140
+ }
141
+ // 向下舍出
142
+ if (mode === MATH.ROUND_FLOOR) {
143
+ return _toFixedFloor(num, decimals);
144
+ }
145
+ }
146
+ /**
147
+ * 尽可能保留小数位数
148
+ * @param {String|Number} num 数字
149
+ * @param {Number} decimals 保留小数的位数,默认2位
150
+ * @param {Number} mode 保留小数模式
151
+ * @returns {Number} 返回保留后的数字
152
+ */
153
+ function toDecimal(num, decimals = 2, mode = MATH.ROUND) {
154
+ // 四舍五入
155
+ if (mode === MATH.ROUND) {
156
+ return _toDecimalRound(num, decimals);
157
+ }
158
+ // 向下舍出
159
+ if (mode === MATH.ROUND_FLOOR) {
160
+ return _toDecimalFloor(num, decimals);
161
+ }
162
+ }
163
+ /* 内部函数 */
164
+ /**
165
+ * 四舍五入,强制保留小数位数
166
+ * @description 默认保留两位小数,此方法解决原生的toFixed()会五舍六入的问题
167
+ * @param {String|Number} num 数字
168
+ * @param {Number} decimals 保留小数的位数,默认2位
169
+ * @returns {String} 返回字符串的数字
170
+ */
171
+ function _toFixedRound(num, decimals = 2) {
172
+ if (isNaN(num)) {
173
+ return "--";
174
+ }
175
+ let s = String(num);
176
+ if (!decimals)
177
+ decimals = 0;
178
+ if (s.indexOf(".") === -1)
179
+ s += ".";
180
+ s += new Array(decimals + 1).join("0");
181
+ if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (decimals + 1) + "})?)\\d*$").test(s)) {
182
+ let s = "0" + RegExp.$2, pm = RegExp.$1, a = RegExp.$3.length, b = true;
183
+ if (a === decimals + 2) {
184
+ a = s.match(/\d/g);
185
+ if (parseInt(a[a.length - 1]) > 4) {
186
+ for (let i = a.length - 2; i >= 0; i--) {
187
+ a[i] = parseInt(a[i]) + 1;
188
+ if (a[i] === 10) {
189
+ a[i] = 0;
190
+ b = i !== 1;
191
+ }
192
+ else
193
+ break;
194
+ }
195
+ }
196
+ s = a.join("").replace(new RegExp("(\\d+)(\\d{" + decimals + "})\\d$"), "$1.$2");
197
+ }
198
+ if (b)
199
+ s = s.substr(1);
200
+ return (pm + s).replace(/\.$/, "");
201
+ }
202
+ return String(num);
203
+ }
204
+ /**
205
+ * 向下舍出,强制保留小数位数
206
+ * @description 默认保留两位小数,此方法相当于强制截取小数位数
207
+ * @param {String|Number} num 数字
208
+ * @param {Number} decimals 保留小数的位数,默认2位
209
+ * @returns {Number} 返回字符串的数字
210
+ */
211
+ function _toFixedFloor(num, decimals = 2) {
212
+ if (isNaN(num)) {
213
+ return "--";
214
+ }
215
+ // 默认为保留的小数点后两位
216
+ let dec = decimals;
217
+ let tempNum = Number(num);
218
+ let pointIndex = String(tempNum).indexOf(".") + 1; // 获取小数点的位置 + 1
219
+ let pointCount = pointIndex ? String(tempNum).length - pointIndex : 0; // 获取小数点后的个数(需要保证有小数位)
220
+ // 源数据为整数或者小数点后面小于decimals位的作补零处理
221
+ if (pointIndex === 0 || pointCount <= dec) {
222
+ let tempNumA = tempNum;
223
+ if (pointIndex === 0) {
224
+ tempNumA = `${tempNumA}.`;
225
+ for (let index = 0; index < dec - pointCount; index++) {
226
+ tempNumA = `${tempNumA}0`;
227
+ }
228
+ }
229
+ else {
230
+ for (let index = 0; index < dec - pointCount; index++) {
231
+ tempNumA = `${tempNumA}0`;
232
+ }
233
+ }
234
+ return tempNumA;
235
+ }
236
+ let realVal = "";
237
+ // 截取当前数据到小数点后decimals位
238
+ realVal = `${String(tempNum).split(".")[0]}.${String(tempNum).split(".")[1].substring(0, dec)}`;
239
+ return String(realVal);
240
+ }
241
+ /**
242
+ * 四舍五入,尽可能保留小数
243
+ * @param {String|Number} num 数字
244
+ * @param {Number} decimals 保留小数的位数,默认2位
245
+ * @returns {Number} 返回保留后的数字
246
+ */
247
+ function _toDecimalRound(num, decimals = 2) {
248
+ if (isNaN(num)) {
249
+ return "--";
250
+ }
251
+ let n = Math.pow(10, decimals);
252
+ return Math.round(num * n) / n;
253
+ }
254
+ /**
255
+ * 向下舍入,尽可能保留小数
256
+ * @param {String|Number} num 数字
257
+ * @param {Number} decimals 保留小数的位数,默认2位
258
+ * @returns {Number} 返回保留后的数字
259
+ */
260
+ function _toDecimalFloor(num, decimals = 2) {
261
+ if (isNaN(num)) {
262
+ return "--";
263
+ }
264
+ let n = Math.pow(10, decimals);
265
+ return Math.floor(num * n) / n;
266
+ }
267
+
268
+ export { add, divide, gcd, modulo, multiply, scm, subtract, toDecimal, toFixed };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 转为数字类型
3
+ * @description 解决部分浏览器在转换 '08','09'等是0开头时被默认转8进制问题
4
+ * @param {String,number} value 转换的值
5
+ * @param {Number} radix 进制数,默认10进制
6
+ * @returns {Number} 返回转换后的数字
7
+ */
8
+ export function parseInt(value: any, radix?: number): number;
9
+ /**
10
+ * 转为小数类型
11
+ * @param {String,number} value 转换的值
12
+ * @returns {Number} 返回转换后的数字
13
+ */
14
+ export function parseFloat(value: any): number;
@@ -0,0 +1,28 @@
1
+ import { isNull } from '../validate/index.mjs';
2
+
3
+ /**
4
+ * 转为数字类型
5
+ * @description 解决部分浏览器在转换 '08','09'等是0开头时被默认转8进制问题
6
+ * @param {String,number} value 转换的值
7
+ * @param {Number} radix 进制数,默认10进制
8
+ * @returns {Number} 返回转换后的数字
9
+ */
10
+ function parseInt(value, radix = 10) {
11
+ if (isNull(value)) {
12
+ return 0;
13
+ }
14
+ return Number.parseInt(value, radix);
15
+ }
16
+ /**
17
+ * 转为小数类型
18
+ * @param {String,number} value 转换的值
19
+ * @returns {Number} 返回转换后的数字
20
+ */
21
+ function parseFloat(value) {
22
+ if (isNull(value)) {
23
+ return 0.0;
24
+ }
25
+ return Number.parseFloat(value);
26
+ }
27
+
28
+ export { parseFloat, parseInt };
@@ -0,0 +1,83 @@
1
+ /**
2
+ * map转object
3
+ * @param {Map} map 参数
4
+ * @returns {Object} 返回Object
5
+ */
6
+ export function mapToObject(map: Map<any, any>): Object;
7
+ /**
8
+ * map转json字符串
9
+ * @param {Map} map 参数
10
+ * @returns {String} 返回Json字符串
11
+ */
12
+ export function mapToJson(map: Map<any, any>): string;
13
+ /**
14
+ * object转map
15
+ * @param {Object} obj 参数
16
+ * @returns {Map} 返回Map
17
+ */
18
+ export function objectToMap(obj: Object): Map<any, any>;
19
+ /**
20
+ * json字符串转map
21
+ * @param {String} json json字符串
22
+ * @returns {Map} 返回Map
23
+ */
24
+ export function jsonToMap(json: string): Map<any, any>;
25
+ /**
26
+ * json对象转json字符串
27
+ * @param {Object} json json对象
28
+ * @returns {String} 返回Json字符串
29
+ */
30
+ export function stringifyJson(json: Object): string;
31
+ /**
32
+ * json字符串转json对象
33
+ * @param {String} json json字符串
34
+ * @returns {Object} 返回Json对象
35
+ */
36
+ export function parseJson(json: string): Object;
37
+ /**
38
+ * 浅拷贝数据
39
+ * @param {*} source 拷贝的数据
40
+ * @returns {*} 返回浅拷贝的数据
41
+ */
42
+ export function clone(source: any): any;
43
+ /**
44
+ * 深拷贝数据
45
+ * @param {*} source 拷贝的数据
46
+ * @returns {*} 返回深拷贝的数据
47
+ */
48
+ export function deepClone(source: any): any;
49
+ /**
50
+ * 比较两个对象是否相等
51
+ * @description 方法只能对比简单的对象,不能包含function,另外对象的属性顺序不一致也是相等的
52
+ * @param {Object} obj1 对象1
53
+ * @param {Object} obj2 对象2
54
+ * @returns {Boolean} 返回true和false
55
+ */
56
+ export function objectEquals(obj1: Object, obj2: Object): boolean;
57
+ /**
58
+ * 合并对象
59
+ * @param {Object} target 目标对象
60
+ * @param {Object[]} source 原对象列表
61
+ * @returns {Object} 返回合并后的对象
62
+ */
63
+ export function merge(target: Object, ...source: Object[]): Object;
64
+ /**
65
+ * 根据字符串属性路径获取目标对象的值
66
+ * @example
67
+ * let res = {code:200, data:{rows:[], pages:{current:1,pageSize:20}}}
68
+ * this._getValueByPath(res, 'data.pages.pageSize'); // 这里会输出20
69
+ * @param {Object} target 目标对象
70
+ * @param {String} path 字符串属性路径
71
+ * @returns {Object} 返回目标对象
72
+ */
73
+ export function getValueByPath(target: Object, path?: string): Object;
74
+ /**
75
+ * 根据字符串属性路径设置目标对象的值
76
+ * @example
77
+ * let res = {code:200, data:{rows:[], pages:{current:1,pageSize:20}}}
78
+ * this._setValueByPath(res, 'data.pages.pageSize', 30); // 打印res对象会发现pageSize的值改为了30
79
+ * @param {Object} target 目标对象
80
+ * @param {String} path 字符串属性路径
81
+ * @param {*} value 值
82
+ */
83
+ export function setValueByPath(target: Object, path: string, value: any): Object;
@@ -0,0 +1,259 @@
1
+ import { isEmpty, isObject, isArray, isDate, isNaN } from '../validate/index.mjs';
2
+
3
+ /* 对象转换 */
4
+ /**
5
+ * map转object
6
+ * @param {Map} map 参数
7
+ * @returns {Object} 返回Object
8
+ */
9
+ function mapToObject(map) {
10
+ let obj = Object.create(null);
11
+ for (let [k, v] of map) {
12
+ obj[k] = v;
13
+ }
14
+ return obj;
15
+ }
16
+ /**
17
+ * map转json字符串
18
+ * @param {Map} map 参数
19
+ * @returns {String} 返回Json字符串
20
+ */
21
+ function mapToJson(map) {
22
+ return JSON.stringify(mapToObject(map));
23
+ }
24
+ /**
25
+ * object转map
26
+ * @param {Object} obj 参数
27
+ * @returns {Map} 返回Map
28
+ */
29
+ function objectToMap(obj) {
30
+ let map = new Map();
31
+ for (let k of Object.keys(obj)) {
32
+ map.set(k, obj[k]);
33
+ }
34
+ return map;
35
+ }
36
+ /**
37
+ * json字符串转map
38
+ * @param {String} json json字符串
39
+ * @returns {Map} 返回Map
40
+ */
41
+ function jsonToMap(json) {
42
+ return objectToMap(JSON.parse(json));
43
+ }
44
+ /**
45
+ * json对象转json字符串
46
+ * @param {Object} json json对象
47
+ * @returns {String} 返回Json字符串
48
+ */
49
+ function stringifyJson(json) {
50
+ return JSON.stringify(json);
51
+ }
52
+ /**
53
+ * json字符串转json对象
54
+ * @param {String} json json字符串
55
+ * @returns {Object} 返回Json对象
56
+ */
57
+ function parseJson(json) {
58
+ if (isEmpty(json))
59
+ return;
60
+ return JSON.parse(json);
61
+ }
62
+ /* 数据拷贝,对比,合并等操作 */
63
+ /**
64
+ * 浅拷贝数据
65
+ * @param {*} source 拷贝的数据
66
+ * @returns {*} 返回浅拷贝的数据
67
+ */
68
+ function clone(source) {
69
+ return Object.assign(source);
70
+ }
71
+ /**
72
+ * 深拷贝数据
73
+ * @param {*} source 拷贝的数据
74
+ * @returns {*} 返回深拷贝的数据
75
+ */
76
+ function deepClone(source) {
77
+ // Object
78
+ if (isObject(source)) {
79
+ let copy = {};
80
+ for (let attr in source) {
81
+ if (source.hasOwnProperty(attr))
82
+ copy[attr] = deepClone(source[attr]);
83
+ }
84
+ return copy;
85
+ }
86
+ // Array
87
+ else if (isArray(source)) {
88
+ let copy = [];
89
+ for (let i = 0, len = source.length; i < len; i++) {
90
+ copy[i] = deepClone(source[i]);
91
+ }
92
+ return copy;
93
+ }
94
+ // Date
95
+ else if (isDate(source)) {
96
+ let copy = new Date();
97
+ copy.setTime(source.getTime());
98
+ return copy;
99
+ }
100
+ // Other 返回原数据
101
+ else {
102
+ return source;
103
+ }
104
+ }
105
+ /**
106
+ * 比较两个对象是否相等
107
+ * @description 方法只能对比简单的对象,不能包含function,另外对象的属性顺序不一致也是相等的
108
+ * @param {Object} obj1 对象1
109
+ * @param {Object} obj2 对象2
110
+ * @returns {Boolean} 返回true和false
111
+ */
112
+ function objectEquals(obj1, obj2) {
113
+ // 比较值相等
114
+ if (obj1 === obj2) {
115
+ return true;
116
+ }
117
+ // 比较Date
118
+ if (obj1 instanceof Date && obj2 instanceof Date) {
119
+ return obj1.getTime() === obj2.getTime();
120
+ }
121
+ // 对象比较引用
122
+ if (!obj1 || !obj2 || (typeof obj1 !== "object" && typeof obj2 !== "object")) {
123
+ return obj1 === obj2;
124
+ }
125
+ // 比较原型
126
+ if (obj1.prototype !== obj2.prototype) {
127
+ return false;
128
+ }
129
+ // 比较对象的值
130
+ const keys = Object.keys(obj1);
131
+ if (keys.length !== Object.keys(obj2).length) {
132
+ return false;
133
+ }
134
+ else {
135
+ return keys.every((k) => objectEquals(obj1[k], obj2[k]));
136
+ }
137
+ }
138
+ /**
139
+ * 合并对象
140
+ * @param {Object} target 目标对象
141
+ * @param {Object[]} source 原对象列表
142
+ * @returns {Object} 返回合并后的对象
143
+ */
144
+ function merge(target, ...source) {
145
+ return Object.assign(target, ...source);
146
+ }
147
+ /* 根据字符串属性路径操作目标对象 */
148
+ /**
149
+ * 根据字符串属性路径获取目标对象的值
150
+ * @example
151
+ * let res = {code:200, data:{rows:[], pages:{current:1,pageSize:20}}}
152
+ * this._getValueByPath(res, 'data.pages.pageSize'); // 这里会输出20
153
+ * @param {Object} target 目标对象
154
+ * @param {String} path 字符串属性路径
155
+ * @returns {Object} 返回目标对象
156
+ */
157
+ function getValueByPath(target, path = "data") {
158
+ const paths = (path || "data").split(".");
159
+ let current = target;
160
+ for (const index in paths) {
161
+ let part = paths[index];
162
+ // 判断属性是取的数组
163
+ let { propName, propIndex, isArray } = _getTargetPathPart(paths[index]);
164
+ if (isArray) {
165
+ // 获取的数组下标超出实际的长度
166
+ if (propIndex < 0 || propIndex >= current[propName].length) {
167
+ return undefined;
168
+ }
169
+ // 逐层向下找到对应属性的值
170
+ current = current[propName][propIndex];
171
+ }
172
+ // 判断属性是取的对象属性
173
+ else {
174
+ // 如果属性不存在,则返回空的
175
+ if (!current || !current.hasOwnProperty(part) || typeof current !== "object") {
176
+ return undefined;
177
+ }
178
+ // 逐层向下找到对应属性的值
179
+ current = current[part];
180
+ }
181
+ }
182
+ return current;
183
+ }
184
+ /**
185
+ * 根据字符串属性路径设置目标对象的值
186
+ * @example
187
+ * let res = {code:200, data:{rows:[], pages:{current:1,pageSize:20}}}
188
+ * this._setValueByPath(res, 'data.pages.pageSize', 30); // 打印res对象会发现pageSize的值改为了30
189
+ * @param {Object} target 目标对象
190
+ * @param {String} path 字符串属性路径
191
+ * @param {*} value 值
192
+ */
193
+ function setValueByPath(target, path = "data", value) {
194
+ const paths = (path || "data").split(".");
195
+ let current = target;
196
+ // 遍历到路径的倒数第二个属性
197
+ for (let index = 0; index < paths.length - 1; index++) {
198
+ let part = paths[index];
199
+ let nextPart = paths[index + 1];
200
+ // 判断属性是取的数组
201
+ let { propName, propIndex, isArray } = _getTargetPathPart(part);
202
+ if (isArray) {
203
+ // 检查当前属性是否存在,若不存在或者不是数组,则创建一个数组
204
+ if (!current || !current.hasOwnProperty(propName)) {
205
+ current[propName] = [];
206
+ }
207
+ // 确保数组长度足够容纳指定索引
208
+ while (current[propName].length <= propIndex) {
209
+ current[propName].push({});
210
+ }
211
+ // 逐层向下找到对应属性的值
212
+ current = current[propName][propIndex];
213
+ }
214
+ else {
215
+ // 如果不是数组索引形式,处理普通对象属性,如果是.1.数组形式,则还是返回数组
216
+ if (!current || !current.hasOwnProperty(part) || typeof current[part] !== "object") {
217
+ current[part] = isNaN(nextPart) ? [] : {};
218
+ }
219
+ // 移动到对象的下一层属性
220
+ current = current[part];
221
+ }
222
+ }
223
+ // 处理最后一个路径部分
224
+ let lastPath = paths[paths.length - 1];
225
+ let { propName, propIndex, isArray } = _getTargetPathPart(lastPath);
226
+ if (isArray) {
227
+ // 检查当前属性是否存在,若不存在或者不是数组,则创建一个数组
228
+ if (!current.hasOwnProperty(propName) || !Array.isArray(current[propName])) {
229
+ current[propName] = [];
230
+ }
231
+ // 确保数组长度足够容纳指定索引
232
+ while (current[propName].length <= propIndex) {
233
+ current[propName].push({});
234
+ }
235
+ // 逐层向下找到对应属性的值
236
+ current[propName][propIndex] = value;
237
+ }
238
+ else {
239
+ current[lastPath] = value;
240
+ }
241
+ // 返回源对象
242
+ return target;
243
+ }
244
+ /* 内部方法 */
245
+ /**
246
+ * 获得目标路径的片段
247
+ * @param path
248
+ * @returns {{propName: (*|undefined), propIndex: (*|number|undefined), isArray: boolean}}
249
+ */
250
+ function _getTargetPathPart(path) {
251
+ let pathArrayMatch = path.match(/^(\w+)\[(\d+)]$/);
252
+ return {
253
+ propName: (pathArrayMatch && pathArrayMatch[1]) || undefined, // 属性名
254
+ propIndex: pathArrayMatch ? parseInt(pathArrayMatch[2], 10) : undefined, // 属性数组时候的下标
255
+ isArray: !!pathArrayMatch, // 是否是数组
256
+ };
257
+ }
258
+
259
+ export { clone, deepClone, getValueByPath, jsonToMap, mapToJson, mapToObject, merge, objectEquals, objectToMap, parseJson, setValueByPath, stringifyJson };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 获得分页起始数
3
+ * @param {Object} pagination 分页参数
4
+ * @returns {Array} 返回起始数
5
+ */
6
+ export function getLimit(pagination?: Object): any[];
7
+ /**
8
+ * 获得总条数
9
+ * @param {Object} pagination 分页参数
10
+ * @returns {Number} 返回总条数
11
+ */
12
+ export function getTotalPage(pagination?: Object): number;
13
+ /**
14
+ * 获得彩虹分页器
15
+ * @param {Object} pagination 分页参数
16
+ * @param {Function} callback 回调函数
17
+ * @returns {Promise} 返回彩虹分页器数据
18
+ */
19
+ export function getRainbowPager(pagination: Object | undefined, callback: Function): Promise<any>;
20
+ /**
21
+ * 获得上一页
22
+ * @param {Object} pagination 分页参数
23
+ * @param {Function} callback 回调函数
24
+ * @returns {Promise} 返回上一页
25
+ */
26
+ export function getPrevPage(pagination: Object | undefined, callback: Function): Promise<any>;
27
+ /**
28
+ * 获得下一页
29
+ * @description 最后一页会根据totalPage参数判断,如果不传此参数,则会根据参数中pageSize和total重新计算总页数
30
+ * @param {Object} pagination 分页参数
31
+ * @param {Function} callback 回调函数
32
+ * @returns {Promise} 返回下一页
33
+ */
34
+ export function getNextPage(pagination: Object | undefined, callback: Function): Promise<any>;