@zcrkey/js-utils 0.0.12 → 0.0.15

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.
package/dist/esm/util.js DELETED
@@ -1,744 +0,0 @@
1
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
4
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
5
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
6
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
9
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
13
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
14
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
15
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
16
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
17
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
18
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
19
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
20
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
21
- import { cloneDeep as _cloneDeep } from 'lodash';
22
- import Qs from 'qs';
23
- var CrUtil = /*#__PURE__*/function () {
24
- function CrUtil() {
25
- _classCallCheck(this, CrUtil);
26
- }
27
- _createClass(CrUtil, null, [{
28
- key: "isArray",
29
- value:
30
- /**
31
- * 判断是否为数组
32
- * @param value
33
- * @returns boolean
34
- */
35
- function isArray(value) {
36
- return Array.isArray(value);
37
- }
38
-
39
- /**
40
- * 判断是否为对象
41
- * @param value
42
- * @returns boolean
43
- */
44
- }, {
45
- key: "isObject",
46
- value: function isObject(value) {
47
- return _typeof(value) === 'object' && value !== null && !CrUtil.isArray(value);
48
- }
49
-
50
- /**
51
- * 判断是否为空对象
52
- * @param value
53
- * @returns boolean
54
- */
55
- }, {
56
- key: "isEmptyObject",
57
- value: function isEmptyObject(value) {
58
- return Object.keys(value).length === 0 && value.constructor === Object;
59
- }
60
-
61
- /**
62
- * 判断是否对象的属性是否全部为空
63
- * @param value
64
- * @returns boolean
65
- */
66
- }, {
67
- key: "isObjectPropertiesAllEmpty",
68
- value: function isObjectPropertiesAllEmpty(value) {
69
- return Object.keys(value).every(function (key) {
70
- var _value = value[key];
71
- return _value === undefined || _value === null || _value === '' || _value === 0 && typeof _value === 'number' || isNaN(_value);
72
- });
73
- }
74
-
75
- /**
76
- * 判断是否为日期
77
- * @param value
78
- * @returns boolean
79
- */
80
- }, {
81
- key: "isDate",
82
- value: function isDate(value) {
83
- return Object.prototype.toString.call(value) === '[object Date]';
84
- }
85
-
86
- /**
87
- * 判断是否为字符串
88
- * @param value
89
- * @returns boolean
90
- */
91
- }, {
92
- key: "isString",
93
- value: function isString(value) {
94
- return Object.prototype.toString.call(value) === '[object String]';
95
- }
96
-
97
- /**
98
- * 判断是否为数字
99
- * @param value
100
- * @returns boolean
101
- */
102
- }, {
103
- key: "isNumber",
104
- value: function isNumber(value) {
105
- return typeof value === 'number' && !isNaN(value);
106
- }
107
-
108
- /**
109
- * 判断是否为文件 File
110
- * @param value
111
- * @returns boolean
112
- */
113
- }, {
114
- key: "isFile",
115
- value: function isFile(value) {
116
- return Object.prototype.toString.call(value) === '[object File]';
117
- }
118
-
119
- /**
120
- * 判断是否为 Boolean
121
- * @param value
122
- * @returns boolean
123
- */
124
- }, {
125
- key: "isBoolean",
126
- value: function isBoolean(value) {
127
- return Object.prototype.toString.call(value) === '[object Boolean]';
128
- }
129
-
130
- /**
131
- * 判断是否为 Function
132
- * @param value
133
- * @returns boolean
134
- */
135
- }, {
136
- key: "isFunction",
137
- value: function isFunction(value) {
138
- return typeof value === 'function';
139
- }
140
-
141
- /**
142
- * 去掉字符串前后所有空格
143
- * @param str
144
- * @returns string
145
- */
146
- }, {
147
- key: "trim",
148
- value: function trim(str) {
149
- return (str + '').replace(/(^[\s\n\t]+|[\s\n\t]+$)/g, '');
150
- }
151
-
152
- /**
153
- * 获取数组为几维数组
154
- * @param arr
155
- * @returns number
156
- */
157
- }, {
158
- key: "getArrayDimension",
159
- value: function getArrayDimension(arr) {
160
- // 如果不是一个数组,返回 0
161
- if (!CrUtil.isArray(arr)) return 0;
162
-
163
- // 找到数组中的最大维度
164
- var maxDimension = 0;
165
- for (var i = 0; i < arr.length; i++) {
166
- var dimension = CrUtil.getArrayDimension(arr[i]);
167
- maxDimension = Math.max(maxDimension, dimension);
168
- }
169
- // 返回最大维度加1,代表当前层数
170
- return maxDimension + 1;
171
- }
172
-
173
- /**
174
- * 深拷贝
175
- * @param value
176
- * @returns
177
- */
178
- }, {
179
- key: "cloneDeep",
180
- value: function cloneDeep(value) {
181
- return _cloneDeep(value);
182
- }
183
-
184
- /**
185
- * 深拷贝
186
- * @param target
187
- * @deprecated 即将移除,使用 {@link CrUtil.cloneDeep} 替代
188
- * @returns
189
- */
190
- }, {
191
- key: "deepCopy",
192
- value: function deepCopy(target) {
193
- var _target;
194
- if (CrUtil.isArray(target)) {
195
- _target = [];
196
- for (var i = 0, len = target.length; i < len; i++) {
197
- if (CrUtil.isArray(target[i]) || CrUtil.isObject(target[i])) {
198
- _target.push(CrUtil.deepCopy(target[i]));
199
- } else {
200
- _target.push(target[i]);
201
- }
202
- }
203
- } else if (CrUtil.isObject(target)) {
204
- _target = {};
205
- for (var _i in target) {
206
- if (CrUtil.isArray(target[_i]) || CrUtil.isObject(target[_i])) {
207
- _target[_i] = CrUtil.deepCopy(target[_i]);
208
- } else {
209
- _target[_i] = target[_i];
210
- }
211
- }
212
- } else {
213
- _target = target;
214
- }
215
- return _target;
216
- }
217
-
218
- /**
219
- * 列表数据转树型数据
220
- * @param listData
221
- * @param settings
222
- * @param settings.idField 默认值 id
223
- * @param settings.pidField 默认值 parentId
224
- * @param settings.childrenField 默认值 children
225
- * @deprecated 即将移除,使用 {@link CrTreeUtil.listToTree} 替代
226
- * @returns
227
- */
228
- }, {
229
- key: "listToTreeData",
230
- value: function listToTreeData(listData, settings) {
231
- var options = Object.assign({
232
- idField: 'id',
233
- pidField: 'parentId',
234
- childrenField: 'children',
235
- isDeepCopy: false,
236
- getData: function getData(item) {
237
- return item;
238
- }
239
- }, settings);
240
- var idField = options.idField,
241
- pidField = options.pidField,
242
- childrenField = options.childrenField,
243
- isDeepCopy = options.isDeepCopy,
244
- getData = options.getData;
245
- if (isDeepCopy) {
246
- listData = CrUtil.deepCopy(listData);
247
- }
248
-
249
- // 构建索引
250
- var pidMap = new Map();
251
- var idMap = new Map();
252
- var _iterator = _createForOfIteratorHelper(listData),
253
- _step;
254
- try {
255
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
256
- var _item = _step.value;
257
- var pid = _item[pidField];
258
- var id = _item[idField];
259
- if (!pidMap.has(pid)) {
260
- pidMap.set(pid, []);
261
- }
262
- pidMap.get(pid).push(_item);
263
- idMap.set(id, _item);
264
- }
265
-
266
- // 递归构建树 + 字段过滤
267
- } catch (err) {
268
- _iterator.e(err);
269
- } finally {
270
- _iterator.f();
271
- }
272
- var buildTree = function buildTree(pid) {
273
- var children = pidMap.get(pid) || [];
274
- return children.map(function (item) {
275
- var rawChildren = buildTree(item[idField]);
276
- var node = _objectSpread({}, getData(item));
277
- if (rawChildren.length > 0) {
278
- node[childrenField] = rawChildren;
279
- }
280
- return node;
281
- });
282
- };
283
-
284
- // 收集所有根节点 pid,去重
285
- var rootPids = new Set();
286
- var _iterator2 = _createForOfIteratorHelper(pidMap.keys()),
287
- _step2;
288
- try {
289
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
290
- var _pid = _step2.value;
291
- if (_pid === undefined || _pid === null || _pid === 0 || !idMap.has(_pid)) {
292
- rootPids.add(_pid);
293
- }
294
- }
295
-
296
- // 构建最终树
297
- } catch (err) {
298
- _iterator2.e(err);
299
- } finally {
300
- _iterator2.f();
301
- }
302
- var tree = [];
303
- var _iterator3 = _createForOfIteratorHelper(rootPids),
304
- _step3;
305
- try {
306
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
307
- var _pid2 = _step3.value;
308
- tree.push.apply(tree, _toConsumableArray(buildTree(_pid2)));
309
- }
310
-
311
- // 只构建根节点(pid 为 null / 0 / undefined / 不存在)
312
- // const tree = buildTree(undefined)
313
- // .concat(buildTree(null))
314
- // .concat(buildTree(0))
315
- // .concat(
316
- // Array.from(pidMap.keys())
317
- // .filter((pid) => !idMap.has(pid))
318
- // .flatMap((pid) => buildTree(pid)),
319
- // );
320
- } catch (err) {
321
- _iterator3.e(err);
322
- } finally {
323
- _iterator3.f();
324
- }
325
- return tree;
326
- }
327
-
328
- /**
329
- * 树型数据转列表数据
330
- * @param treeData
331
- * @param settings
332
- * @param settings.idField 默认值 id
333
- * @param settings.pidField 默认值 parentId
334
- * @param settings.childrenField 默认值 children
335
- * @deprecated 即将移除,使用 {@link CrTreeUtil.treeToList} 替代
336
- * @returns
337
- */
338
- }, {
339
- key: "treeDataToListData",
340
- value: function treeDataToListData(treeData) {
341
- var pid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
342
- var settings = arguments.length > 2 ? arguments[2] : undefined;
343
- var options = Object.assign({
344
- idField: 'id',
345
- pidField: 'parentId',
346
- childrenField: 'children',
347
- isDeepCopy: false
348
- }, settings);
349
- var listData = [];
350
- for (var i = 0; i < treeData.length; i++) {
351
- var node = treeData[i];
352
- var _item2 = _objectSpread({}, node);
353
- _item2[options.pidField] = pid;
354
- delete _item2[options.childrenField];
355
- listData.push(_item2);
356
- if (node[options.childrenField]) {
357
- var _listData;
358
- var childrenList = this.treeDataToListData(node[options.childrenField], _item2[options.idField], settings);
359
- (_listData = listData).push.apply(_listData, _toConsumableArray(childrenList));
360
- }
361
- }
362
- if (options.isDeepCopy) {
363
- listData = CrUtil.deepCopy(listData);
364
- }
365
- return listData;
366
- }
367
-
368
- /**
369
- * 获取所有父级数据(包含自身)
370
- * @param listData
371
- * @param value
372
- * @param settings
373
- * @param settings.valueField 默认值 value
374
- * @param settings.idField 默认值 id
375
- * @param settings.pidField 默认值 parentId
376
- * @deprecated 即将移除,使用 {@link CrTreeUtil.getFlatParentDatas} 替代
377
- * @returns
378
- */
379
- }, {
380
- key: "getParentNodes",
381
- value: function getParentNodes(listData, value, settings) {
382
- var options = Object.assign({
383
- valueField: 'value',
384
- idField: 'id',
385
- pidField: 'parentId',
386
- getData: function getData(item) {
387
- return item;
388
- }
389
- }, settings);
390
- if (!(listData && listData.length > 0) || !value) {
391
- return [];
392
- }
393
- var idField = options.idField;
394
- var pidField = options.pidField;
395
- var valueField = options.valueField;
396
- var nodes = [];
397
- var node = listData.find(function (item) {
398
- return item[valueField] == value;
399
- });
400
- if (node) {
401
- nodes.push(options.getData(node));
402
- while (node && node[pidField]) {
403
- var parentOption = listData.find(
404
- // eslint-disable-next-line @typescript-eslint/no-loop-func
405
- function (item) {
406
- return item[idField] == node[pidField];
407
- });
408
- if (parentOption) {
409
- nodes.push(options.getData(parentOption));
410
- }
411
- node = parentOption;
412
- }
413
- }
414
- nodes.reverse();
415
- return nodes;
416
- }
417
-
418
- /**
419
- * 参数序列化
420
- * @param params {a:'1',b:{},c:[]}
421
- * @returns
422
- */
423
- }, {
424
- key: "paramsSerializer",
425
- value: function paramsSerializer(params, settings) {
426
- var options = Object.assign({
427
- isFilterNonNull: false
428
- }, settings);
429
- if (options.isFilterNonNull) {
430
- Object.keys(params).forEach(function (key) {
431
- if (params[key] === null || params[key] === undefined || params[key] === '') {
432
- delete params[key];
433
- }
434
- });
435
- }
436
- return Qs.stringify(params);
437
- }
438
-
439
- /**
440
- * 参数解析
441
- * @param {*} str
442
- * @param {*} settings
443
- * @returns
444
- */
445
- }, {
446
- key: "paramsParse",
447
- value: function paramsParse(str, settings) {
448
- var obj = {};
449
- var option = Object.assign({
450
- ignoreQueryPrefix: true
451
- }, settings);
452
- if (str) {
453
- obj = Qs.parse(str, option);
454
- }
455
- return obj;
456
- }
457
-
458
- /**
459
- * 获取 URL 参数
460
- * @param {*} url
461
- * @returns
462
- * @example
463
- * "https://example.com?foo=bar&baz=qux" => {"query":{"foo":"bar","baz":"qux"},"hash":{},"all":{"foo":"bar","baz":"qux"}}
464
- * "https://example.com/page?foo=1#/?a=1&b=2" => {"query":{"foo":"1"},"hash":{"/":"","a":"1","b":"2"},"all":{"foo":"1","/":"","a":"1","b":"2"}},
465
- */
466
- }, {
467
- key: "getQueryParams",
468
- value: function getQueryParams(url) {
469
- var query = {};
470
- var hash = {};
471
- var all = {};
472
- var parse = function parse(queryString) {
473
- if (!queryString) {
474
- return {};
475
- }
476
- try {
477
- return Qs.parse(queryString);
478
- } catch (_unused) {
479
- var result = {};
480
- if (!queryString) return result;
481
- queryString.split('&').forEach(function (pair) {
482
- if (!pair) return;
483
- var _pair$split = pair.split('='),
484
- _pair$split2 = _slicedToArray(_pair$split, 2),
485
- key = _pair$split2[0],
486
- val = _pair$split2[1];
487
- if (key) result[decodeURIComponent(key)] = decodeURIComponent(val || '');
488
- });
489
- return result;
490
- }
491
- };
492
- try {
493
- var _url$split = url.split('#'),
494
- _url$split2 = _slicedToArray(_url$split, 2),
495
- base = _url$split2[0],
496
- hashPart = _url$split2[1];
497
- var queryPart = base.split('?')[1];
498
- Object.assign(query, parse(queryPart));
499
- if (hashPart) {
500
- var _iterator4 = _createForOfIteratorHelper(hashPart.split('?')),
501
- _step4;
502
- try {
503
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
504
- var part = _step4.value;
505
- Object.assign(hash, parse(part));
506
- }
507
- } catch (err) {
508
- _iterator4.e(err);
509
- } finally {
510
- _iterator4.f();
511
- }
512
- }
513
- Object.assign(all, query, hash);
514
- } catch (error) {
515
- console.error('getQueryParams:', error);
516
- }
517
- return {
518
- query: query,
519
- hash: hash,
520
- all: all
521
- };
522
- }
523
-
524
- /**
525
- * 版本号比较
526
- * @param v1
527
- * @param v2
528
- * @returns number
529
- * @description v1大于v2(1)、v1小于v2(-1)、v1等于v2(0)
530
- */
531
- }, {
532
- key: "compareVersion",
533
- value: function compareVersion(v1, v2) {
534
- var v1Arr = CrUtil.trim(v1).split('.');
535
- var v2Arr = CrUtil.trim(v2).split('.');
536
- var len = Math.max(v1.length, v2.length);
537
- while (v1Arr.length < len) {
538
- v1Arr.push('0');
539
- }
540
- while (v2Arr.length < len) {
541
- v2Arr.push('0');
542
- }
543
- for (var i = 0; i < len; i++) {
544
- var num1 = parseInt(v1Arr[i]);
545
- var num2 = parseInt(v2Arr[i]);
546
- if (num1 > num2) {
547
- return 1;
548
- } else if (num1 < num2) {
549
- return -1;
550
- }
551
- }
552
- return 0;
553
- }
554
-
555
- /**
556
- * 根据 ids 获取相对应的数据名称
557
- * @param data
558
- * @param ids
559
- * @param settings
560
- * @returns string
561
- */
562
- }, {
563
- key: "getDataNameByIds",
564
- value: function getDataNameByIds(data, ids, settings) {
565
- var options = Object.assign({
566
- sep: '、',
567
- idField: 'id',
568
- nameField: 'name'
569
- }, settings);
570
- var str = '';
571
- if (ids && ids.length > 0) {
572
- str = ids.map(function (id) {
573
- var item = data.find(function (item) {
574
- return item[options.idField] == id;
575
- });
576
- if (item) {
577
- return item[options.nameField];
578
- } else {
579
- return '';
580
- }
581
- }).join(options.sep);
582
- }
583
- return str;
584
- }
585
-
586
- /**
587
- * 追加html标签属性值
588
- * @param htmlStr
589
- * @param tagName
590
- * @param attrName
591
- * @param newAttrValue
592
- * @returns string
593
- */
594
- }, {
595
- key: "appendHtmlTagAttr",
596
- value: function appendHtmlTagAttr(htmlStr, tagName, attrName, newAttrValue) {
597
- var regex = new RegExp("(<".concat(tagName, "\\s+)([^>]*?)([^>]*>)"), 'g');
598
- var replacedHtml = htmlStr.replace(regex, function (match, p1, p2, p3) {
599
- var _regex = new RegExp("".concat(attrName, "=\"(.*?)\""), 'g');
600
- if (_regex.exec(match)) {
601
- var __regex = new RegExp("(<".concat(tagName, "\\s+)([^>]*?)").concat(attrName, "=\"(.*)\"([^>]*>)"), 'g');
602
- return match.replace(__regex, function (_match, _p1, _p2, _p3, _p4) {
603
- return _p1 + _p2 + "".concat(attrName, "=\"").concat(_p3, " ").concat(newAttrValue, "\"") + _p4;
604
- });
605
- } else {
606
- return p1 + "".concat(attrName, "=\"").concat(newAttrValue, "\" ") + p3;
607
- }
608
- });
609
- replacedHtml = replacedHtml.replace(new RegExp("<".concat(tagName, ">"), 'g'), "<".concat(tagName, " ").concat(attrName, "=\"").concat(newAttrValue, "\">"));
610
- return replacedHtml;
611
- }
612
-
613
- /**
614
- * 比较数据差异
615
- * @param data1
616
- * @param data2
617
- * @returns
618
- */
619
- }, {
620
- key: "compareDataDiff",
621
- value: function compareDataDiff(data1, data2) {
622
- var diffFieldSet = {};
623
- var compare = function compare(path, o1, o2) {
624
- if (CrUtil.isArray(o1) && CrUtil.isArray(o2)) {
625
- // 如果两者都是数组,比较它们的长度和内容
626
- var lengthDiff = o1.length - o2.length;
627
- if (lengthDiff !== 0) {
628
- // 数组长度不同
629
- diffFieldSet[path] = 'modified';
630
- if (lengthDiff > 0) {
631
- // o1比o2长,所以o1中有多余的元素
632
- for (var i = o2.length; i < o1.length; i++) {
633
- diffFieldSet["".concat(path, "[").concat(i, "]")] = 'removed'; // 只在o1中存在
634
- }
635
- } else {
636
- // o2比o1长,所以o2中有新增的元素
637
- for (var _i2 = o1.length; _i2 < o2.length; _i2++) {
638
- diffFieldSet["".concat(path, "[").concat(_i2, "]")] = 'added'; // 只在o2中存在
639
- }
640
- }
641
- } else {
642
- for (var _i3 = 0; _i3 < o1.length; _i3++) {
643
- compare("".concat(path, "[").concat(_i3, "]"), o1[_i3], o2[_i3]);
644
- }
645
- }
646
- } else if (CrUtil.isObject(o1) && CrUtil.isObject(o2)) {
647
- // 如果两者都是对象,遍历它们的属性
648
- // eslint-disable-next-line guard-for-in
649
- for (var key in o1) {
650
- var _path = path ? "".concat(path, ".").concat(key) : key;
651
- if (Object.prototype.hasOwnProperty.call(o1, key) && !(key in o2)) {
652
- diffFieldSet[_path] = 'removed'; // 只在o1中存在
653
- } else if (Object.prototype.hasOwnProperty.call(o2, key)) {
654
- compare(_path, o1[key], o2[key]);
655
- }
656
- }
657
- // 检查o2中是否存在o1中没有的属性
658
- // eslint-disable-next-line guard-for-in
659
- for (var _key in o2) {
660
- var _path2 = path ? "".concat(path, ".").concat(_key) : _key;
661
- if (Object.prototype.hasOwnProperty.call(o2, _key) && !(_key in o1)) {
662
- diffFieldSet[_path2] = 'added'; // 只在o2中存在
663
- }
664
- }
665
- } else if (o1 !== o2) {
666
- // 既不是对象也不是数组,直接比较值
667
- diffFieldSet[path] = 'modified';
668
- }
669
- };
670
- compare('', data1, data2);
671
- return diffFieldSet;
672
- }
673
-
674
- /**
675
- * 格式化为千分位,主要用于展示格式化
676
- * @param value
677
- * @returns 12345.6789 => 12,345.6789
678
- */
679
- }, {
680
- key: "fmtThousands",
681
- value: function fmtThousands(value) {
682
- if (value == undefined || value == null || isNaN(Number(value))) {
683
- return String(value);
684
- }
685
- var _String$split = String(value).split('.'),
686
- _String$split2 = _slicedToArray(_String$split, 2),
687
- intPart = _String$split2[0],
688
- decimalPart = _String$split2[1];
689
- var formattedInt = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
690
- return decimalPart ? "".concat(formattedInt, ".").concat(decimalPart) : formattedInt;
691
- }
692
-
693
- /**
694
- * 格式化为千分位格式
695
- * @param value
696
- * @returns
697
- */
698
- }, {
699
- key: "formatThousands",
700
- value: function formatThousands(value) {
701
- if (value == null) return '';
702
- var raw = String(value).trim();
703
- if (!raw) return '';
704
- // 是否末尾点
705
- var hasTrailingDot = raw.endsWith('.');
706
- // 只保留数字/点/负号
707
- var str = raw.replace(/[^\d.-]/g, '');
708
- // 负号只留开头
709
- var sign = str.startsWith('-') ? '-' : '';
710
- str = str.replace(/-/g, '');
711
- // 提取整数/小数(只认第一个点)
712
- var _str$split = str.split('.', 2),
713
- _str$split2 = _slicedToArray(_str$split, 2),
714
- intRaw = _str$split2[0],
715
- _str$split2$ = _str$split2[1],
716
- decRaw = _str$split2$ === void 0 ? '' : _str$split2$;
717
- // 整数去逗号+前导0
718
- var intPart = intRaw.replace(/,/g, '').replace(/^0+(?=\d)/, '');
719
- // 千分位
720
- var formattedInt = intPart ? intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',') : '';
721
- var result = sign + formattedInt;
722
- if (decRaw || hasTrailingDot) result += '.';
723
- if (decRaw) result += decRaw;
724
- return result;
725
- }
726
-
727
- /**
728
- * 解析千分位格式
729
- * @param value
730
- * @returns
731
- */
732
- }, {
733
- key: "parseThousands",
734
- value: function parseThousands(value) {
735
- if (value == null) return '';
736
- return String(value).trim().replace(/,/g, '') // 去千分位
737
- .replace(/[^\d.-]/g, '') // 去非法
738
- .replace(/(?!^)-/g, '') // 只留首负号
739
- .replace(/(\..*)\./g, '$1'); // 只留第一个点
740
- }
741
- }]);
742
- return CrUtil;
743
- }();
744
- export { CrUtil as default };