@zcrkey/js-utils 0.0.4 → 0.0.6
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/README.md +69 -56
- package/dist/cjs/eventCenter.js +120 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +51 -0
- package/dist/cjs/objUtil.d.ts +12 -0
- package/dist/cjs/objUtil.js +37 -0
- package/dist/cjs/storage.js +118 -0
- package/dist/cjs/treeUtil.d.ts +48 -0
- package/dist/cjs/treeUtil.js +145 -0
- package/dist/{util.d.ts → cjs/util.d.ts} +41 -6
- package/dist/cjs/util.js +572 -0
- package/dist/esm/eventCenter.d.ts +59 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/objUtil.d.ts +12 -0
- package/dist/esm/objUtil.js +28 -0
- package/dist/esm/storage.d.ts +44 -0
- package/dist/esm/treeUtil.d.ts +48 -0
- package/dist/esm/treeUtil.js +185 -0
- package/dist/esm/util.d.ts +209 -0
- package/dist/{util.js → esm/util.js} +117 -6
- package/dist/umd/index.umd.js +1 -0
- package/package.json +15 -6
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -3
- package/dist/index.umd.js +0 -1
- /package/dist/{eventCenter.d.ts → cjs/eventCenter.d.ts} +0 -0
- /package/dist/{storage.d.ts → cjs/storage.d.ts} +0 -0
- /package/dist/{eventCenter.js → esm/eventCenter.js} +0 -0
- /package/dist/{storage.js → esm/storage.js} +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export type TSubscribers = {
|
|
2
|
+
key: string;
|
|
3
|
+
listeners: Array<(...args: any) => void>;
|
|
4
|
+
};
|
|
5
|
+
export type TSubscription = {
|
|
6
|
+
key: string;
|
|
7
|
+
listener: (...args: any) => void;
|
|
8
|
+
remove: () => void;
|
|
9
|
+
};
|
|
10
|
+
export default class CrEventCenter {
|
|
11
|
+
/**
|
|
12
|
+
* 储存订阅者
|
|
13
|
+
*/
|
|
14
|
+
static subscribers: TSubscribers[];
|
|
15
|
+
/**
|
|
16
|
+
* 新增订阅
|
|
17
|
+
*
|
|
18
|
+
* @param {*} key 名称
|
|
19
|
+
* @param {*} listener 执行函数
|
|
20
|
+
* @returns 订阅信息
|
|
21
|
+
* @example
|
|
22
|
+
this.subscription = CrEventCenter.on('名称', (参数) => {});
|
|
23
|
+
*/
|
|
24
|
+
static on(key: string, listener: (...args: any) => void): TSubscription;
|
|
25
|
+
/**
|
|
26
|
+
* 移除订阅
|
|
27
|
+
*
|
|
28
|
+
* @param {*} subscription
|
|
29
|
+
* @param {*} type 'all'
|
|
30
|
+
* @example
|
|
31
|
+
CrEventCenter.off(this.subscription);
|
|
32
|
+
*/
|
|
33
|
+
static off(subscription: TSubscription, type?: 'all'): void;
|
|
34
|
+
/**
|
|
35
|
+
* 派发事件
|
|
36
|
+
*
|
|
37
|
+
* @param {*} key 名称
|
|
38
|
+
* @param {*} args 其余参数
|
|
39
|
+
* @example
|
|
40
|
+
CrEventCenter.emit('名称', 参数数据);
|
|
41
|
+
*/
|
|
42
|
+
static emit(key: string, ...args: any): void;
|
|
43
|
+
/**
|
|
44
|
+
* 查找事件
|
|
45
|
+
*
|
|
46
|
+
* @param {*} key 名称
|
|
47
|
+
* @example
|
|
48
|
+
let subscriber = CrEventCenter.find('名称');
|
|
49
|
+
*/
|
|
50
|
+
static find(key: string): TSubscribers | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* 清理所有事件
|
|
53
|
+
*
|
|
54
|
+
* @memberof CrEventCenter
|
|
55
|
+
* @example
|
|
56
|
+
CrEventCenter.clear();
|
|
57
|
+
*/
|
|
58
|
+
static clear(): void;
|
|
59
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type * from './eventCenter';
|
|
2
|
+
export { default as CrEventCenter } from './eventCenter';
|
|
3
|
+
export type * from './objUtil';
|
|
4
|
+
export { default as CrObjUtil } from './objUtil';
|
|
5
|
+
export { default as CrStorage } from './storage';
|
|
6
|
+
export type * from './treeUtil';
|
|
7
|
+
export { default as CrTreeUtil } from './treeUtil';
|
|
8
|
+
export { default as CrUtil } from './util';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PropertyPath } from 'lodash';
|
|
2
|
+
export type { PropertyPath };
|
|
3
|
+
export default class CrObjUtil {
|
|
4
|
+
/**
|
|
5
|
+
* 根据字段路径获取对象值
|
|
6
|
+
* @param obj { 'a': [{ 'b': { 'c': 3 } }] }
|
|
7
|
+
* @param path 'a[0].b.c' | ['a', '0', 'b', 'c']
|
|
8
|
+
* @param defaultValue 找不到时返回的默认值
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
static getValueByPath(obj: Record<string | number | symbol, any>, propertyPath: PropertyPath, defaultValue?: any): any;
|
|
12
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
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); }
|
|
2
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
3
|
+
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); } }
|
|
4
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
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); }
|
|
7
|
+
import { get } from 'lodash';
|
|
8
|
+
var CrObjUtil = /*#__PURE__*/function () {
|
|
9
|
+
function CrObjUtil() {
|
|
10
|
+
_classCallCheck(this, CrObjUtil);
|
|
11
|
+
}
|
|
12
|
+
_createClass(CrObjUtil, null, [{
|
|
13
|
+
key: "getValueByPath",
|
|
14
|
+
value:
|
|
15
|
+
/**
|
|
16
|
+
* 根据字段路径获取对象值
|
|
17
|
+
* @param obj { 'a': [{ 'b': { 'c': 3 } }] }
|
|
18
|
+
* @param path 'a[0].b.c' | ['a', '0', 'b', 'c']
|
|
19
|
+
* @param defaultValue 找不到时返回的默认值
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
function getValueByPath(obj, propertyPath, defaultValue) {
|
|
23
|
+
return get(obj, propertyPath, defaultValue);
|
|
24
|
+
}
|
|
25
|
+
}]);
|
|
26
|
+
return CrObjUtil;
|
|
27
|
+
}();
|
|
28
|
+
export { CrObjUtil as default };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export default class CrStorage {
|
|
2
|
+
/**
|
|
3
|
+
* 设置本地存储
|
|
4
|
+
* @param key
|
|
5
|
+
* @param data
|
|
6
|
+
*/
|
|
7
|
+
static setLocalItem(key: string, data: any): void;
|
|
8
|
+
/**
|
|
9
|
+
* 获取本地存储
|
|
10
|
+
* @param key
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
static getLocalItem<T = any>(key: string): T | null;
|
|
14
|
+
/**
|
|
15
|
+
* 清除某个本地存储
|
|
16
|
+
* @param key
|
|
17
|
+
*/
|
|
18
|
+
static removeLocalItem(key: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* 清除所有本地存储
|
|
21
|
+
*/
|
|
22
|
+
static clearLocal(): void;
|
|
23
|
+
/**
|
|
24
|
+
* 设置会话存储
|
|
25
|
+
* @param key
|
|
26
|
+
* @param data
|
|
27
|
+
*/
|
|
28
|
+
static setSessionItem(key: string, data: any): void;
|
|
29
|
+
/**
|
|
30
|
+
* 获取会话存储
|
|
31
|
+
* @param key
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
static getSessionItem<T = any>(key: string): T | null;
|
|
35
|
+
/**
|
|
36
|
+
* 清除某个会话存储
|
|
37
|
+
* @param key
|
|
38
|
+
*/
|
|
39
|
+
static removeSessionItem(key: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* 清除所有会话存储
|
|
42
|
+
*/
|
|
43
|
+
static clearSession(): void;
|
|
44
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export default class CrTreeUtil {
|
|
2
|
+
/**
|
|
3
|
+
* 列表数据转树形数据
|
|
4
|
+
* @param list
|
|
5
|
+
* @param options
|
|
6
|
+
* @param options.idField 默认值 id
|
|
7
|
+
* @param options.parentIdField 默认值 parentId
|
|
8
|
+
* @param options.childrenField 默认值 children
|
|
9
|
+
* @param options.isCloneDeep 是否需要深拷贝, 默认值为 true
|
|
10
|
+
* @param options.getData 处理数据
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
static listToTree<T extends Record<string, any>>(list: T[], options?: {
|
|
14
|
+
idField?: string;
|
|
15
|
+
parentIdField?: string;
|
|
16
|
+
childrenField?: string;
|
|
17
|
+
isCloneDeep?: boolean;
|
|
18
|
+
getData?: (item: T) => any;
|
|
19
|
+
}): any[];
|
|
20
|
+
/**
|
|
21
|
+
* 树形数据转列表数据
|
|
22
|
+
* @param tree
|
|
23
|
+
* @param options
|
|
24
|
+
* @param options.childrenField 默认值 children
|
|
25
|
+
* @param options.isCloneDeep 是否需要深拷贝, 默认值为 true
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
static treeToList<T extends Record<string, any>>(tree: T[], options?: {
|
|
29
|
+
childrenField?: string;
|
|
30
|
+
isCloneDeep?: boolean;
|
|
31
|
+
}): T[];
|
|
32
|
+
/**
|
|
33
|
+
* 获取扁平化父数据(包含自身)
|
|
34
|
+
* @param listData
|
|
35
|
+
* @param value
|
|
36
|
+
* @param settings
|
|
37
|
+
* @param settings.valueField 默认值 value
|
|
38
|
+
* @param settings.idField 默认值 id
|
|
39
|
+
* @param settings.parentIdField 默认值 parentId
|
|
40
|
+
* @param settings.getData 过滤数据
|
|
41
|
+
*/
|
|
42
|
+
static getFlatParentDatas<T = any, R extends Record<string, any> = any>(listData: R[], value: number | string, settings?: {
|
|
43
|
+
valueField?: string;
|
|
44
|
+
idField?: string;
|
|
45
|
+
parentIdField?: string;
|
|
46
|
+
getData?: (item: R) => T;
|
|
47
|
+
}): T[];
|
|
48
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
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); }
|
|
2
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
3
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
4
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
5
|
+
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."); }
|
|
6
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
7
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
8
|
+
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; }
|
|
9
|
+
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; }
|
|
10
|
+
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; }
|
|
11
|
+
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; } } }; }
|
|
12
|
+
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); }
|
|
13
|
+
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; }
|
|
14
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
15
|
+
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); } }
|
|
16
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
18
|
+
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); }
|
|
19
|
+
import { cloneDeep as _cloneDeep, find as _find, get as _get, keyBy as _keyBy } from 'lodash';
|
|
20
|
+
var CrTreeUtil = /*#__PURE__*/function () {
|
|
21
|
+
function CrTreeUtil() {
|
|
22
|
+
_classCallCheck(this, CrTreeUtil);
|
|
23
|
+
}
|
|
24
|
+
_createClass(CrTreeUtil, null, [{
|
|
25
|
+
key: "listToTree",
|
|
26
|
+
value:
|
|
27
|
+
/**
|
|
28
|
+
* 列表数据转树形数据
|
|
29
|
+
* @param list
|
|
30
|
+
* @param options
|
|
31
|
+
* @param options.idField 默认值 id
|
|
32
|
+
* @param options.parentIdField 默认值 parentId
|
|
33
|
+
* @param options.childrenField 默认值 children
|
|
34
|
+
* @param options.isCloneDeep 是否需要深拷贝, 默认值为 true
|
|
35
|
+
* @param options.getData 处理数据
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
function listToTree(list, options) {
|
|
39
|
+
var _ref = options || {},
|
|
40
|
+
_ref$idField = _ref.idField,
|
|
41
|
+
idField = _ref$idField === void 0 ? 'id' : _ref$idField,
|
|
42
|
+
_ref$parentIdField = _ref.parentIdField,
|
|
43
|
+
parentIdField = _ref$parentIdField === void 0 ? 'parentId' : _ref$parentIdField,
|
|
44
|
+
_ref$childrenField = _ref.childrenField,
|
|
45
|
+
childrenField = _ref$childrenField === void 0 ? 'children' : _ref$childrenField,
|
|
46
|
+
_ref$isCloneDeep = _ref.isCloneDeep,
|
|
47
|
+
isCloneDeep = _ref$isCloneDeep === void 0 ? true : _ref$isCloneDeep,
|
|
48
|
+
_ref$getData = _ref.getData,
|
|
49
|
+
getData = _ref$getData === void 0 ? function (item) {
|
|
50
|
+
return item;
|
|
51
|
+
} : _ref$getData;
|
|
52
|
+
var listData = isCloneDeep ? _cloneDeep(list) : list;
|
|
53
|
+
var treeData = [];
|
|
54
|
+
var nodeMap = new Map();
|
|
55
|
+
var _iterator = _createForOfIteratorHelper(listData),
|
|
56
|
+
_step;
|
|
57
|
+
try {
|
|
58
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
59
|
+
var _item = _step.value;
|
|
60
|
+
var id = _item[idField];
|
|
61
|
+
var node = _objectSpread(_objectSpread({}, getData(_item)), {}, {
|
|
62
|
+
__origin_id: id,
|
|
63
|
+
__origin_pid: _item[parentIdField]
|
|
64
|
+
});
|
|
65
|
+
nodeMap.set(id, node);
|
|
66
|
+
}
|
|
67
|
+
} catch (err) {
|
|
68
|
+
_iterator.e(err);
|
|
69
|
+
} finally {
|
|
70
|
+
_iterator.f();
|
|
71
|
+
}
|
|
72
|
+
var _iterator2 = _createForOfIteratorHelper(nodeMap.values()),
|
|
73
|
+
_step2;
|
|
74
|
+
try {
|
|
75
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
76
|
+
var _node = _step2.value;
|
|
77
|
+
var parentId = _node.__origin_pid;
|
|
78
|
+
if (parentId === undefined || parentId === null || parentId === 0 || !nodeMap.has(parentId)) {
|
|
79
|
+
treeData.push(_node);
|
|
80
|
+
} else {
|
|
81
|
+
var parentNode = nodeMap.get(parentId);
|
|
82
|
+
if (!parentNode[childrenField]) {
|
|
83
|
+
parentNode[childrenField] = [];
|
|
84
|
+
}
|
|
85
|
+
parentNode[childrenField].push(_node);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
_iterator2.e(err);
|
|
90
|
+
} finally {
|
|
91
|
+
_iterator2.f();
|
|
92
|
+
}
|
|
93
|
+
var clean = function clean(nodes) {
|
|
94
|
+
var _iterator3 = _createForOfIteratorHelper(nodes),
|
|
95
|
+
_step3;
|
|
96
|
+
try {
|
|
97
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
98
|
+
var node = _step3.value;
|
|
99
|
+
delete node.__origin_id;
|
|
100
|
+
delete node.__origin_pid;
|
|
101
|
+
if (node[childrenField]) {
|
|
102
|
+
clean(node[childrenField]);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} catch (err) {
|
|
106
|
+
_iterator3.e(err);
|
|
107
|
+
} finally {
|
|
108
|
+
_iterator3.f();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
clean(treeData);
|
|
112
|
+
return treeData;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* 树形数据转列表数据
|
|
117
|
+
* @param tree
|
|
118
|
+
* @param options
|
|
119
|
+
* @param options.childrenField 默认值 children
|
|
120
|
+
* @param options.isCloneDeep 是否需要深拷贝, 默认值为 true
|
|
121
|
+
* @returns
|
|
122
|
+
*/
|
|
123
|
+
}, {
|
|
124
|
+
key: "treeToList",
|
|
125
|
+
value: function treeToList(tree, options) {
|
|
126
|
+
var _ref2 = options || {},
|
|
127
|
+
_ref2$childrenField = _ref2.childrenField,
|
|
128
|
+
childrenField = _ref2$childrenField === void 0 ? 'children' : _ref2$childrenField,
|
|
129
|
+
_ref2$isCloneDeep = _ref2.isCloneDeep,
|
|
130
|
+
isCloneDeep = _ref2$isCloneDeep === void 0 ? true : _ref2$isCloneDeep;
|
|
131
|
+
var result = [];
|
|
132
|
+
var queue = _toConsumableArray(tree);
|
|
133
|
+
while (queue.length) {
|
|
134
|
+
var node = queue.shift();
|
|
135
|
+
var children = node[childrenField];
|
|
136
|
+
var _ = node[childrenField],
|
|
137
|
+
rest = _objectWithoutProperties(node, [childrenField].map(_toPropertyKey));
|
|
138
|
+
result.push(rest);
|
|
139
|
+
if (children && children.length) {
|
|
140
|
+
queue.push.apply(queue, _toConsumableArray(children));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return isCloneDeep ? _cloneDeep(result) : result;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 获取扁平化父数据(包含自身)
|
|
148
|
+
* @param listData
|
|
149
|
+
* @param value
|
|
150
|
+
* @param settings
|
|
151
|
+
* @param settings.valueField 默认值 value
|
|
152
|
+
* @param settings.idField 默认值 id
|
|
153
|
+
* @param settings.parentIdField 默认值 parentId
|
|
154
|
+
* @param settings.getData 过滤数据
|
|
155
|
+
*/
|
|
156
|
+
}, {
|
|
157
|
+
key: "getFlatParentDatas",
|
|
158
|
+
value: function getFlatParentDatas(listData, value, settings) {
|
|
159
|
+
if (!Array.isArray(listData) || listData.length === 0 || value == null) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
var options = Object.assign({
|
|
163
|
+
valueField: 'value',
|
|
164
|
+
idField: 'id',
|
|
165
|
+
parentIdField: 'parentId',
|
|
166
|
+
getData: function getData(item) {
|
|
167
|
+
return item;
|
|
168
|
+
}
|
|
169
|
+
}, settings);
|
|
170
|
+
var nodeMap = _keyBy(listData, options.valueField);
|
|
171
|
+
var result = [];
|
|
172
|
+
var visited = new Set();
|
|
173
|
+
var current = nodeMap[value];
|
|
174
|
+
while (current && !visited.has(_get(current, options.idField))) {
|
|
175
|
+
visited.add(_get(current, options.idField));
|
|
176
|
+
result.unshift(options.getData(current));
|
|
177
|
+
var parentId = _get(current, options.parentIdField);
|
|
178
|
+
current = _find(listData, [options.valueField, parentId]);
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
}]);
|
|
183
|
+
return CrTreeUtil;
|
|
184
|
+
}();
|
|
185
|
+
export { CrTreeUtil as default };
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
export default class CrUtil {
|
|
2
|
+
/**
|
|
3
|
+
* 判断是否为数组
|
|
4
|
+
* @param value
|
|
5
|
+
* @returns boolean
|
|
6
|
+
*/
|
|
7
|
+
static isArray<T = any>(value: any): value is T[];
|
|
8
|
+
/**
|
|
9
|
+
* 判断是否为对象
|
|
10
|
+
* @param value
|
|
11
|
+
* @returns boolean
|
|
12
|
+
*/
|
|
13
|
+
static isObject<T = any>(value: T): value is T extends object ? (T extends any[] ? never : T) : never;
|
|
14
|
+
/**
|
|
15
|
+
* 判断是否为空对象
|
|
16
|
+
* @param value
|
|
17
|
+
* @returns boolean
|
|
18
|
+
*/
|
|
19
|
+
static isEmptyObject(value: object): value is Record<string | number, never>;
|
|
20
|
+
/**
|
|
21
|
+
* 判断是否对象的属性是否全部为空
|
|
22
|
+
* @param value
|
|
23
|
+
* @returns boolean
|
|
24
|
+
*/
|
|
25
|
+
static isObjectPropertiesAllEmpty(value: Record<string | number, any>): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* 判断是否为日期
|
|
28
|
+
* @param value
|
|
29
|
+
* @returns boolean
|
|
30
|
+
*/
|
|
31
|
+
static isDate(value: unknown): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* 判断是否为字符串
|
|
34
|
+
* @param value
|
|
35
|
+
* @returns boolean
|
|
36
|
+
*/
|
|
37
|
+
static isString(value: unknown): value is string;
|
|
38
|
+
/**
|
|
39
|
+
* 判断是否为数字
|
|
40
|
+
* @param value
|
|
41
|
+
* @returns boolean
|
|
42
|
+
*/
|
|
43
|
+
static isNumber(value: unknown): value is number;
|
|
44
|
+
/**
|
|
45
|
+
* 判断是否为文件 File
|
|
46
|
+
* @param value
|
|
47
|
+
* @returns boolean
|
|
48
|
+
*/
|
|
49
|
+
static isFile(value: unknown): value is File;
|
|
50
|
+
/**
|
|
51
|
+
* 判断是否为 Boolean
|
|
52
|
+
* @param value
|
|
53
|
+
* @returns boolean
|
|
54
|
+
*/
|
|
55
|
+
static isBoolean(value: unknown): value is boolean;
|
|
56
|
+
/**
|
|
57
|
+
* 判断是否为 Function
|
|
58
|
+
* @param value
|
|
59
|
+
* @returns boolean
|
|
60
|
+
*/
|
|
61
|
+
static isFunction(value: unknown): value is (...args: any[]) => any;
|
|
62
|
+
/**
|
|
63
|
+
* 去掉字符串前后所有空格
|
|
64
|
+
* @param str
|
|
65
|
+
* @returns string
|
|
66
|
+
*/
|
|
67
|
+
static trim(str: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* 获取数组为几维数组
|
|
70
|
+
* @param arr
|
|
71
|
+
* @returns number
|
|
72
|
+
*/
|
|
73
|
+
static getArrayDimension(arr: any[]): number;
|
|
74
|
+
/**
|
|
75
|
+
* 深拷贝
|
|
76
|
+
* @param value
|
|
77
|
+
* @returns
|
|
78
|
+
*/
|
|
79
|
+
static cloneDeep<T>(value: T): T;
|
|
80
|
+
/**
|
|
81
|
+
* 深拷贝
|
|
82
|
+
* @param target
|
|
83
|
+
* @deprecated 即将移除,使用 {@link CrUtil.cloneDeep} 替代
|
|
84
|
+
* @returns
|
|
85
|
+
*/
|
|
86
|
+
static deepCopy<T = any>(target: T): T;
|
|
87
|
+
/**
|
|
88
|
+
* 列表数据转树型数据
|
|
89
|
+
* @param listData
|
|
90
|
+
* @param settings
|
|
91
|
+
* @param settings.idField 默认值 id
|
|
92
|
+
* @param settings.pidField 默认值 parentId
|
|
93
|
+
* @param settings.childrenField 默认值 children
|
|
94
|
+
* @deprecated 即将移除,使用 {@link CrObjUtil.listToTree} 替代
|
|
95
|
+
* @returns
|
|
96
|
+
*/
|
|
97
|
+
static listToTreeData(listData: any[], settings?: {
|
|
98
|
+
idField?: string;
|
|
99
|
+
pidField?: string;
|
|
100
|
+
childrenField?: string;
|
|
101
|
+
isDeepCopy?: boolean;
|
|
102
|
+
getData?: (item: any) => any;
|
|
103
|
+
}): any[];
|
|
104
|
+
/**
|
|
105
|
+
* 树型数据转列表数据
|
|
106
|
+
* @param treeData
|
|
107
|
+
* @param settings
|
|
108
|
+
* @param settings.idField 默认值 id
|
|
109
|
+
* @param settings.pidField 默认值 parentId
|
|
110
|
+
* @param settings.childrenField 默认值 children
|
|
111
|
+
* @deprecated 即将移除,使用 {@link CrObjUtil.treeToList} 替代
|
|
112
|
+
* @returns
|
|
113
|
+
*/
|
|
114
|
+
static treeDataToListData(treeData: any[], pid?: string | number, settings?: {
|
|
115
|
+
childrenField?: string;
|
|
116
|
+
idField?: string;
|
|
117
|
+
pidField?: string;
|
|
118
|
+
isDeepCopy?: boolean;
|
|
119
|
+
}): any[];
|
|
120
|
+
/**
|
|
121
|
+
* 获取所有父级数据(包含自身)
|
|
122
|
+
* @param listData
|
|
123
|
+
* @param value
|
|
124
|
+
* @param settings
|
|
125
|
+
* @param settings.valueField 默认值 value
|
|
126
|
+
* @param settings.idField 默认值 id
|
|
127
|
+
* @param settings.pidField 默认值 parentId
|
|
128
|
+
* @deprecated 即将移除,使用 {@link CrObjUtil.getFlatParentDatas} 替代
|
|
129
|
+
* @returns
|
|
130
|
+
*/
|
|
131
|
+
static getParentNodes<T, R extends Record<string, any>>(listData: R[], value: number | string, settings?: {
|
|
132
|
+
valueField?: string;
|
|
133
|
+
idField?: string;
|
|
134
|
+
pidField?: string;
|
|
135
|
+
getData?: (item: R) => T;
|
|
136
|
+
}): T[];
|
|
137
|
+
/**
|
|
138
|
+
* 参数序列化
|
|
139
|
+
* @param params {a:'1',b:{},c:[]}
|
|
140
|
+
* @returns
|
|
141
|
+
*/
|
|
142
|
+
static paramsSerializer(params: Record<string, any>, settings?: {
|
|
143
|
+
isFilterNonNull: boolean;
|
|
144
|
+
}): string;
|
|
145
|
+
/**
|
|
146
|
+
* 参数解析
|
|
147
|
+
* @param {*} str
|
|
148
|
+
* @param {*} settings
|
|
149
|
+
* @returns
|
|
150
|
+
*/
|
|
151
|
+
static paramsParse(str: string, settings?: {
|
|
152
|
+
ignoreQueryPrefix: boolean;
|
|
153
|
+
}): {};
|
|
154
|
+
/**
|
|
155
|
+
* 获取 URL 参数
|
|
156
|
+
* @param {*} url
|
|
157
|
+
* @returns
|
|
158
|
+
* @example
|
|
159
|
+
* "https://example.com?foo=bar&baz=qux" => {"query":{"foo":"bar","baz":"qux"},"hash":{},"all":{"foo":"bar","baz":"qux"}}
|
|
160
|
+
* "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"}},
|
|
161
|
+
*/
|
|
162
|
+
static getQueryParams(url: string): {
|
|
163
|
+
query: Record<string, any>;
|
|
164
|
+
hash: Record<string, any>;
|
|
165
|
+
all: Record<string, any>;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* 版本号比较
|
|
169
|
+
* @param v1
|
|
170
|
+
* @param v2
|
|
171
|
+
* @returns number
|
|
172
|
+
* @description v1大于v2(1)、v1小于v2(-1)、v1等于v2(0)
|
|
173
|
+
*/
|
|
174
|
+
static compareVersion(v1: string, v2: string): number;
|
|
175
|
+
/**
|
|
176
|
+
* 根据 ids 获取相对应的数据名称
|
|
177
|
+
* @param data
|
|
178
|
+
* @param ids
|
|
179
|
+
* @param settings
|
|
180
|
+
* @returns string
|
|
181
|
+
*/
|
|
182
|
+
static getDataNameByIds<T extends Record<string, any>>(data: T[], ids: (string | number)[], settings?: {
|
|
183
|
+
sep?: string;
|
|
184
|
+
nameField?: string;
|
|
185
|
+
idField?: string;
|
|
186
|
+
}): string;
|
|
187
|
+
/**
|
|
188
|
+
* 追加html标签属性值
|
|
189
|
+
* @param htmlStr
|
|
190
|
+
* @param tagName
|
|
191
|
+
* @param attrName
|
|
192
|
+
* @param newAttrValue
|
|
193
|
+
* @returns string
|
|
194
|
+
*/
|
|
195
|
+
static appendHtmlTagAttr(htmlStr: string, tagName: string, attrName: string, newAttrValue: string): string;
|
|
196
|
+
/**
|
|
197
|
+
* 比较数据差异
|
|
198
|
+
* @param data1
|
|
199
|
+
* @param data2
|
|
200
|
+
* @returns
|
|
201
|
+
*/
|
|
202
|
+
static compareDataDiff(data1: any, data2: any): Record<string, "added" | "removed" | "modified">;
|
|
203
|
+
/**
|
|
204
|
+
* 格式化为千分位
|
|
205
|
+
* @param value
|
|
206
|
+
* @returns 12345.6789 => 12,345.6789
|
|
207
|
+
*/
|
|
208
|
+
static fmtThousands(value: number | string | undefined): string;
|
|
209
|
+
}
|