sculp-js 1.13.3-beta.0 → 1.13.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.
Files changed (119) hide show
  1. package/dist/cjs/_virtual/_commonjsHelpers.js +3 -3
  2. package/dist/cjs/array.js +36 -46
  3. package/dist/cjs/async.js +41 -43
  4. package/dist/cjs/base64.js +77 -66
  5. package/dist/cjs/clipboard.js +54 -53
  6. package/dist/cjs/cloneDeep.js +90 -91
  7. package/dist/cjs/cookie.js +27 -30
  8. package/dist/cjs/date.js +101 -98
  9. package/dist/cjs/dom.js +114 -121
  10. package/dist/cjs/download.js +77 -78
  11. package/dist/cjs/easing.js +29 -32
  12. package/dist/cjs/file.js +147 -152
  13. package/dist/cjs/func.js +64 -78
  14. package/dist/cjs/index.js +1 -3
  15. package/dist/cjs/math.js +32 -38
  16. package/dist/cjs/node_modules/bezier-easing/src/index.js +35 -23
  17. package/dist/cjs/number.js +58 -61
  18. package/dist/cjs/object.js +112 -126
  19. package/dist/cjs/path.js +39 -43
  20. package/dist/cjs/qs.js +34 -41
  21. package/dist/cjs/random.js +31 -34
  22. package/dist/cjs/string.js +62 -63
  23. package/dist/cjs/tooltip.js +66 -69
  24. package/dist/cjs/tree.js +265 -263
  25. package/dist/cjs/type.js +42 -46
  26. package/dist/cjs/unique.js +39 -42
  27. package/dist/cjs/url.js +47 -48
  28. package/dist/cjs/validator.js +38 -38
  29. package/dist/cjs/variable.js +27 -21
  30. package/dist/cjs/watermark.js +78 -67
  31. package/dist/esm/array.js +36 -46
  32. package/dist/esm/async.js +41 -43
  33. package/dist/esm/base64.js +77 -66
  34. package/dist/esm/clipboard.js +55 -54
  35. package/dist/esm/cloneDeep.js +90 -91
  36. package/dist/esm/cookie.js +27 -30
  37. package/dist/esm/date.js +101 -98
  38. package/dist/esm/dom.js +114 -121
  39. package/dist/esm/download.js +78 -79
  40. package/dist/esm/easing.js +29 -32
  41. package/dist/esm/file.js +147 -152
  42. package/dist/esm/func.js +64 -78
  43. package/dist/esm/index.js +96 -8
  44. package/dist/esm/math.js +32 -38
  45. package/dist/esm/number.js +58 -61
  46. package/dist/esm/object.js +124 -127
  47. package/dist/esm/path.js +39 -43
  48. package/dist/esm/qs.js +34 -41
  49. package/dist/esm/random.js +31 -34
  50. package/dist/esm/string.js +74 -64
  51. package/dist/esm/tooltip.js +66 -69
  52. package/dist/esm/tree.js +265 -263
  53. package/dist/esm/type.js +68 -47
  54. package/dist/esm/unique.js +39 -42
  55. package/dist/esm/url.js +47 -48
  56. package/dist/esm/validator.js +56 -39
  57. package/dist/esm/variable.js +27 -21
  58. package/dist/esm/watermark.js +79 -68
  59. package/dist/types/array.d.ts +0 -1
  60. package/dist/types/async.d.ts +0 -1
  61. package/dist/types/base64.d.ts +0 -1
  62. package/dist/types/clipboard.d.ts +0 -1
  63. package/dist/types/cloneDeep.d.ts +0 -1
  64. package/dist/types/cookie.d.ts +0 -1
  65. package/dist/types/date.d.ts +0 -1
  66. package/dist/types/dom.d.ts +0 -1
  67. package/dist/types/download.d.ts +0 -1
  68. package/dist/types/easing.d.ts +0 -1
  69. package/dist/types/file.d.ts +0 -1
  70. package/dist/types/func.d.ts +0 -1
  71. package/dist/types/index.d.ts +0 -1
  72. package/dist/types/math.d.ts +0 -1
  73. package/dist/types/number.d.ts +0 -1
  74. package/dist/types/object.d.ts +0 -1
  75. package/dist/types/path.d.ts +0 -1
  76. package/dist/types/qs.d.ts +0 -1
  77. package/dist/types/random.d.ts +0 -1
  78. package/dist/types/string.d.ts +0 -1
  79. package/dist/types/tooltip.d.ts +0 -1
  80. package/dist/types/tree.d.ts +2 -2
  81. package/dist/types/type.d.ts +0 -1
  82. package/dist/types/unique.d.ts +0 -1
  83. package/dist/types/url.d.ts +0 -1
  84. package/dist/types/validator.d.ts +0 -1
  85. package/dist/types/variable.d.ts +0 -1
  86. package/dist/types/watermark.d.ts +0 -1
  87. package/dist/umd/index.min.js +2 -2
  88. package/package.json +12 -6
  89. package/dist/types/array.d.ts.map +0 -1
  90. package/dist/types/async.d.ts.map +0 -1
  91. package/dist/types/base64.d.ts.map +0 -1
  92. package/dist/types/clipboard.d.ts.map +0 -1
  93. package/dist/types/cloneDeep.d.ts.map +0 -1
  94. package/dist/types/cookie.d.ts.map +0 -1
  95. package/dist/types/core-index.d.ts +0 -17
  96. package/dist/types/core-index.d.ts.map +0 -1
  97. package/dist/types/date.d.ts.map +0 -1
  98. package/dist/types/dom.d.ts.map +0 -1
  99. package/dist/types/download.d.ts.map +0 -1
  100. package/dist/types/easing.d.ts.map +0 -1
  101. package/dist/types/file.d.ts.map +0 -1
  102. package/dist/types/func.d.ts.map +0 -1
  103. package/dist/types/index.d.ts.map +0 -1
  104. package/dist/types/index.js +0 -3278
  105. package/dist/types/math.d.ts.map +0 -1
  106. package/dist/types/number.d.ts.map +0 -1
  107. package/dist/types/object.d.ts.map +0 -1
  108. package/dist/types/path.d.ts.map +0 -1
  109. package/dist/types/qs.d.ts.map +0 -1
  110. package/dist/types/random.d.ts.map +0 -1
  111. package/dist/types/string.d.ts.map +0 -1
  112. package/dist/types/tooltip.d.ts.map +0 -1
  113. package/dist/types/tree.d.ts.map +0 -1
  114. package/dist/types/type.d.ts.map +0 -1
  115. package/dist/types/unique.d.ts.map +0 -1
  116. package/dist/types/url.d.ts.map +0 -1
  117. package/dist/types/validator.d.ts.map +0 -1
  118. package/dist/types/variable.d.ts.map +0 -1
  119. package/dist/types/watermark.d.ts.map +0 -1
package/dist/cjs/tree.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * sculp-js v1.13.3-beta.0
2
+ * sculp-js v1.13.6
3
3
  * (c) 2023-present chandq
4
4
  * Released under the MIT License.
5
5
  */
@@ -11,10 +11,10 @@ var type = require('./type.js');
11
11
 
12
12
  const defaultFieldOptions = { keyField: 'key', childField: 'children', pidField: 'pid' };
13
13
  const defaultSearchTreeOptions = {
14
- childField: 'children',
15
- nameField: 'name',
16
- removeEmptyChild: false,
17
- ignoreCase: true
14
+ childField: 'children',
15
+ nameField: 'name',
16
+ removeEmptyChild: false,
17
+ ignoreCase: true
18
18
  };
19
19
  /**
20
20
  * 树遍历函数(支持continue和break操作), 可用于遍历Array和NodeList类型的数据
@@ -23,112 +23,113 @@ const defaultSearchTreeOptions = {
23
23
  * @param {options} options 支持定制子元素名称、反向遍历、广度优先遍历,默认{
24
24
  childField: 'children',
25
25
  reverse: false,
26
- breadthFirst: false
26
+ breadthFirst: false,
27
+ isDomNode: false,
27
28
  }
28
29
  * @returns {*}
29
30
  */
30
- function forEachDeep(tree, iterator, options = {
31
+ function forEachDeep(
32
+ tree,
33
+ iterator,
34
+ options = {
31
35
  childField: 'children',
32
36
  reverse: false,
33
37
  breadthFirst: false,
34
38
  isDomNode: false
35
- }) {
36
- const { childField = 'children', reverse = false, breadthFirst = false, isDomNode = false } = type.isObject(options) ? options : {};
37
- let isBreak = false;
38
- const queue = [];
39
- const walk = (arr, parent, level = 0) => {
40
- if (reverse) {
41
- for (let index = arr.length - 1; index >= 0; index--) {
42
- if (isBreak) {
43
- break;
44
- }
45
- const item = arr[index];
46
- // 广度优先
47
- if (breadthFirst) {
48
- queue.push({ item, index, array: arr, tree, parent, level });
49
- }
50
- else {
51
- const re = iterator(item, index, arr, tree, parent, level);
52
- if (re === false) {
53
- isBreak = true;
54
- break;
55
- }
56
- else if (re === true) {
57
- continue;
58
- }
59
- if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
60
- walk(item[childField], item, level + 1);
61
- }
62
- }
63
- }
64
- if (breadthFirst) {
65
- // Process queue
66
- while (queue.length > 0 && !isBreak) {
67
- const current = queue.shift();
68
- const { item, index, array, tree, parent, level } = current;
69
- const re = iterator(item, index, array, tree, parent, level);
70
- if (re === false) {
71
- isBreak = true;
72
- break;
73
- }
74
- else if (re === true) {
75
- continue;
76
- }
77
- if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
78
- walk(item[childField], item, level + 1);
79
- }
80
- }
81
- }
39
+ }
40
+ ) {
41
+ const {
42
+ childField = 'children',
43
+ reverse = false,
44
+ breadthFirst = false,
45
+ isDomNode = false
46
+ } = type.isObject(options) ? options : {};
47
+ let isBreak = false;
48
+ const queue = [];
49
+ const reverseWalk = (arr, parent, level = 0) => {
50
+ for (let index = arr.length - 1; index >= 0; index--) {
51
+ if (isBreak) {
52
+ break;
53
+ }
54
+ const item = arr[index];
55
+ // 广度优先
56
+ if (breadthFirst) {
57
+ queue.push({ item, index, array: arr, tree, parent, level });
58
+ } else {
59
+ const re = iterator(item, index, arr, tree, parent, level);
60
+ if (re === false) {
61
+ isBreak = true;
62
+ break;
63
+ } else if (re === true) {
64
+ continue;
82
65
  }
83
- else {
84
- for (let index = 0, len = arr.length; index < len; index++) {
85
- if (isBreak) {
86
- break;
87
- }
88
- const item = arr[index];
89
- if (breadthFirst) {
90
- // 广度优先
91
- queue.push({ item, index: index, array: arr, tree, parent, level });
92
- }
93
- else {
94
- // 深度优先
95
- const re = iterator(item, index, arr, tree, parent, level);
96
- if (re === false) {
97
- isBreak = true;
98
- break;
99
- }
100
- else if (re === true) {
101
- continue;
102
- }
103
- if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
104
- walk(item[childField], item, level + 1);
105
- }
106
- }
107
- }
108
- if (breadthFirst) {
109
- while (queue.length > 0 && !isBreak) {
110
- const current = queue.shift();
111
- if (!current)
112
- break;
113
- const { item, index, array, tree, parent, level } = current;
114
- const re = iterator(item, index, array, tree, parent, level);
115
- if (re === false) {
116
- isBreak = true;
117
- break;
118
- }
119
- else if (re === true) {
120
- continue;
121
- }
122
- if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
123
- walk(item[childField], item, level + 1);
124
- }
125
- }
126
- }
66
+ if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
67
+ reverseWalk(item[childField], item, level + 1);
127
68
  }
128
- };
129
- walk(tree, null, 0);
130
- // @ts-ignore
131
- tree = null;
69
+ }
70
+ }
71
+ if (breadthFirst) {
72
+ // Process queue
73
+ while (queue.length > 0 && !isBreak) {
74
+ const current = queue.shift();
75
+ const { item, index, array, tree, parent, level } = current;
76
+ const re = iterator(item, index, array, tree, parent, level);
77
+ if (re === false) {
78
+ isBreak = true;
79
+ break;
80
+ } else if (re === true) {
81
+ continue;
82
+ }
83
+ if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
84
+ reverseWalk(item[childField], item, level + 1);
85
+ }
86
+ }
87
+ }
88
+ };
89
+ const walk = (arr, parent, level = 0) => {
90
+ for (let index = 0, len = arr.length; index < len; index++) {
91
+ if (isBreak) {
92
+ break;
93
+ }
94
+ const item = arr[index];
95
+ if (breadthFirst) {
96
+ // 广度优先
97
+ queue.push({ item, index: index, array: arr, tree, parent, level });
98
+ } else {
99
+ // 深度优先
100
+ const re = iterator(item, index, arr, tree, parent, level);
101
+ if (re === false) {
102
+ isBreak = true;
103
+ break;
104
+ } else if (re === true) {
105
+ continue;
106
+ }
107
+ if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
108
+ walk(item[childField], item, level + 1);
109
+ }
110
+ }
111
+ }
112
+ if (breadthFirst) {
113
+ while (queue.length > 0 && !isBreak) {
114
+ const current = queue.shift();
115
+ if (!current) break;
116
+ const { item, index, array, tree, parent, level } = current;
117
+ const re = iterator(item, index, array, tree, parent, level);
118
+ if (re === false) {
119
+ isBreak = true;
120
+ break;
121
+ } else if (re === true) {
122
+ continue;
123
+ }
124
+ if (item && (isDomNode ? type.isNodeList(item[childField]) : Array.isArray(item[childField]))) {
125
+ walk(item[childField], item, level + 1);
126
+ }
127
+ }
128
+ }
129
+ };
130
+ reverse ? reverseWalk(tree, null, 0) : walk(tree, null, 0);
131
+ // @ts-ignore
132
+ tree = null;
132
133
  }
133
134
  /**
134
135
  * 创建一个新数组, 深度优先遍历的Map函数(支持continue和break操作), 可用于insert tree item 和 remove tree item
@@ -142,69 +143,68 @@ function forEachDeep(tree, iterator, options = {
142
143
  }
143
144
  * @returns {any[]} 新的一棵树
144
145
  */
145
- function mapDeep(tree, iterator, options = {
146
+ function mapDeep(
147
+ tree,
148
+ iterator,
149
+ options = {
146
150
  childField: 'children',
147
151
  reverse: false
148
- }) {
149
- const { childField = 'children', reverse = false } = type.isObject(options) ? options : {};
150
- let isBreak = false;
151
- const newTree = [];
152
- const walk = (arr, parent, newTree, level = 0) => {
153
- if (reverse) {
154
- for (let i = arr.length - 1; i >= 0; i--) {
155
- if (isBreak) {
156
- break;
157
- }
158
- const item = arr[i];
159
- const re = iterator(item, i, arr, tree, parent, level);
160
- if (re === false) {
161
- isBreak = true;
162
- break;
163
- }
164
- else if (re === true) {
165
- continue;
166
- }
167
- newTree.push(object.objectOmit(re, [childField]));
168
- if (item && Array.isArray(item[childField])) {
169
- newTree[newTree.length - 1][childField] = [];
170
- walk(item[childField], item, newTree[newTree.length - 1][childField], level + 1);
171
- }
172
- else {
173
- // children非有效数组时,移除该属性字段
174
- delete re[childField];
175
- }
176
- }
152
+ }
153
+ ) {
154
+ const { childField = 'children', reverse = false } = type.isObject(options) ? options : {};
155
+ let isBreak = false;
156
+ const newTree = [];
157
+ const walk = (arr, parent, newTree, level = 0) => {
158
+ if (reverse) {
159
+ for (let i = arr.length - 1; i >= 0; i--) {
160
+ if (isBreak) {
161
+ break;
177
162
  }
178
- else {
179
- for (let i = 0; i < arr.length; i++) {
180
- if (isBreak) {
181
- break;
182
- }
183
- const item = arr[i];
184
- const re = iterator(item, i, arr, tree, parent, level);
185
- if (re === false) {
186
- isBreak = true;
187
- break;
188
- }
189
- else if (re === true) {
190
- continue;
191
- }
192
- newTree.push(object.objectOmit(re, [childField]));
193
- if (item && Array.isArray(item[childField])) {
194
- newTree[newTree.length - 1][childField] = [];
195
- walk(item[childField], item, newTree[newTree.length - 1][childField], level + 1);
196
- }
197
- else {
198
- // children非有效数组时,移除该属性字段
199
- delete re[childField];
200
- }
201
- }
163
+ const item = arr[i];
164
+ const re = iterator(item, i, arr, tree, parent, level);
165
+ if (re === false) {
166
+ isBreak = true;
167
+ break;
168
+ } else if (re === true) {
169
+ continue;
202
170
  }
203
- };
204
- walk(tree, null, newTree);
205
- // @ts-ignore
206
- tree = null;
207
- return newTree;
171
+ newTree.push(object.objectOmit(re, [childField]));
172
+ if (item && Array.isArray(item[childField])) {
173
+ newTree[newTree.length - 1][childField] = [];
174
+ walk(item[childField], item, newTree[newTree.length - 1][childField], level + 1);
175
+ } else {
176
+ // children非有效数组时,移除该属性字段
177
+ delete re[childField];
178
+ }
179
+ }
180
+ } else {
181
+ for (let i = 0; i < arr.length; i++) {
182
+ if (isBreak) {
183
+ break;
184
+ }
185
+ const item = arr[i];
186
+ const re = iterator(item, i, arr, tree, parent, level);
187
+ if (re === false) {
188
+ isBreak = true;
189
+ break;
190
+ } else if (re === true) {
191
+ continue;
192
+ }
193
+ newTree.push(object.objectOmit(re, [childField]));
194
+ if (item && Array.isArray(item[childField])) {
195
+ newTree[newTree.length - 1][childField] = [];
196
+ walk(item[childField], item, newTree[newTree.length - 1][childField], level + 1);
197
+ } else {
198
+ // children非有效数组时,移除该属性字段
199
+ delete re[childField];
200
+ }
201
+ }
202
+ }
203
+ };
204
+ walk(tree, null, newTree);
205
+ // @ts-ignore
206
+ tree = null;
207
+ return newTree;
208
208
  }
209
209
  /**
210
210
  * 在树中找到 id 为某个值的节点,并返回上游的所有父级节点
@@ -215,29 +215,30 @@ function mapDeep(tree, iterator, options = {
215
215
  * @returns {[(number | string)[], V[]]} - 由parentId...childId, parentObject-childObject组成的二维数组
216
216
  */
217
217
  function searchTreeById(tree, nodeId, options = { childField: 'children', keyField: 'id' }) {
218
- const { childField = 'children', keyField = 'id' } = type.isObject(options) ? options : {};
219
- const toFlatArray = (tree, parentId, parent) => {
220
- return tree.reduce((t, _) => {
221
- const child = _[childField];
222
- return [
223
- ...t,
224
- parentId ? { ..._, parentId, parent } : _,
225
- ...(child && child.length ? toFlatArray(child, _[keyField], _) : [])
226
- ];
227
- }, []);
228
- };
229
- const getIds = (flatArray) => {
230
- let child = flatArray.find(_ => _[keyField] === nodeId);
231
- const { parent, parentId, ...other } = child;
232
- let ids = [nodeId], nodes = [other];
233
- while (child && child.parentId) {
234
- ids = [child.parentId, ...ids];
235
- nodes = [child.parent, ...nodes];
236
- child = flatArray.find(_ => _[keyField] === child.parentId); // eslint-disable-line
237
- }
238
- return [ids, nodes];
239
- };
240
- return getIds(toFlatArray(tree));
218
+ const { childField = 'children', keyField = 'id' } = type.isObject(options) ? options : {};
219
+ const toFlatArray = (tree, parentId, parent) => {
220
+ return tree.reduce((t, _) => {
221
+ const child = _[childField];
222
+ return [
223
+ ...t,
224
+ parentId ? { ..._, parentId, parent } : _,
225
+ ...(child && child.length ? toFlatArray(child, _[keyField], _) : [])
226
+ ];
227
+ }, []);
228
+ };
229
+ const getIds = flatArray => {
230
+ let child = flatArray.find(_ => _[keyField] === nodeId);
231
+ const { parent, parentId, ...other } = child;
232
+ let ids = [nodeId],
233
+ nodes = [other];
234
+ while (child && child.parentId) {
235
+ ids = [child.parentId, ...ids];
236
+ nodes = [child.parent, ...nodes];
237
+ child = flatArray.find(_ => _[keyField] === child.parentId); // eslint-disable-line
238
+ }
239
+ return [ids, nodes];
240
+ };
241
+ return getIds(toFlatArray(tree));
241
242
  }
242
243
  /**
243
244
  * 扁平化数组转换成树
@@ -247,26 +248,25 @@ function searchTreeById(tree, nodeId, options = { childField: 'children', keyFie
247
248
  * @returns {any[]}
248
249
  */
249
250
  function formatTree(list, options = defaultFieldOptions) {
250
- const { keyField = 'key', childField = 'children', pidField = 'pid' } = type.isObject(options) ? options : {};
251
- const treeArr = [];
252
- const sourceMap = {};
253
- for (let i = 0, len = list.length; i < len; i++) {
254
- const item = list[i];
255
- sourceMap[item[keyField]] = item;
256
- }
257
- for (let i = 0, len = list.length; i < len; i++) {
258
- const item = list[i];
259
- const parent = sourceMap[item[pidField]];
260
- if (parent) {
261
- (parent[childField] || (parent[childField] = [])).push(item);
262
- }
263
- else {
264
- treeArr.push(item);
265
- }
251
+ const { keyField = 'key', childField = 'children', pidField = 'pid' } = type.isObject(options) ? options : {};
252
+ const treeArr = [];
253
+ const sourceMap = {};
254
+ for (let i = 0, len = list.length; i < len; i++) {
255
+ const item = list[i];
256
+ sourceMap[item[keyField]] = item;
257
+ }
258
+ for (let i = 0, len = list.length; i < len; i++) {
259
+ const item = list[i];
260
+ const parent = sourceMap[item[pidField]];
261
+ if (parent) {
262
+ (parent[childField] || (parent[childField] = [])).push(item);
263
+ } else {
264
+ treeArr.push(item);
266
265
  }
267
- // @ts-ignore
268
- list = null;
269
- return treeArr;
266
+ }
267
+ // @ts-ignore
268
+ list = null;
269
+ return treeArr;
270
270
  }
271
271
  /**
272
272
  * 树形结构转扁平化
@@ -276,25 +276,25 @@ function formatTree(list, options = defaultFieldOptions) {
276
276
  * @returns {any[]}
277
277
  */
278
278
  function flatTree(treeList, options = defaultFieldOptions) {
279
- const { keyField = 'key', childField = 'children', pidField = 'pid' } = type.isObject(options) ? options : {};
280
- let res = [];
281
- for (let i = 0, len = treeList.length; i < len; i++) {
282
- const node = treeList[i];
283
- const item = {
284
- ...node,
285
- [childField]: [] // 清空子级
286
- };
287
- type.objectHas(item, childField) && delete item[childField];
288
- res.push(item);
289
- if (node[childField]) {
290
- const children = node[childField].map(item => ({
291
- ...item,
292
- [pidField]: node[keyField] || item.pid // 给子级设置pid
293
- }));
294
- res = res.concat(flatTree(children, options));
295
- }
279
+ const { keyField = 'key', childField = 'children', pidField = 'pid' } = type.isObject(options) ? options : {};
280
+ let res = [];
281
+ for (let i = 0, len = treeList.length; i < len; i++) {
282
+ const node = treeList[i];
283
+ const item = {
284
+ ...node,
285
+ [childField]: [] // 清空子级
286
+ };
287
+ type.objectHas(item, childField) && delete item[childField];
288
+ res.push(item);
289
+ if (node[childField]) {
290
+ const children = node[childField].map(item => ({
291
+ ...item,
292
+ [pidField]: node[keyField] || item.pid // 给子级设置pid
293
+ }));
294
+ res = res.concat(flatTree(children, options));
296
295
  }
297
- return res;
296
+ }
297
+ return res;
298
298
  }
299
299
  /**
300
300
  * 模糊搜索函数,返回包含搜索字符的节点及其祖先节点, 适用于树型组件的字符过滤功能
@@ -316,50 +316,52 @@ function flatTree(treeList, options = defaultFieldOptions) {
316
316
  * @returns {V[]}
317
317
  */
318
318
  function fuzzySearchTree(nodes, filterCondition, options = defaultSearchTreeOptions) {
319
- if (!type.objectHas(filterCondition, 'filter') &&
320
- (!type.objectHas(filterCondition, 'keyword') || type.isEmpty(filterCondition.keyword))) {
321
- return nodes;
322
- }
323
- const result = [];
324
- for (let i = 0, len = nodes.length; i < len; i++) {
325
- const node = nodes[i];
326
- // 递归检查子节点是否匹配
327
- const matchedChildren = node[options.childField] && node[options.childField].length > 0
328
- ? fuzzySearchTree(node[options.childField] || [], filterCondition, options)
329
- : [];
330
- // 检查当前节点是否匹配或者有匹配的子节点
331
- if ((type.objectHas(filterCondition, 'filter')
332
- ? filterCondition.filter(node)
333
- : !options.ignoreCase
334
- ? node[options.nameField].includes(filterCondition.keyword)
335
- : node[options.nameField].toLowerCase().includes(filterCondition.keyword.toLowerCase())) ||
336
- matchedChildren.length > 0) {
337
- // 将当前节点加入结果中
338
- if (node[options.childField]) {
339
- if (matchedChildren.length > 0) {
340
- result.push({
341
- ...node,
342
- [options.childField]: matchedChildren // 包含匹配的子节点
343
- });
344
- }
345
- else if (options.removeEmptyChild) {
346
- const { [options.childField]: _, ...other } = node;
347
- result.push(other);
348
- }
349
- else {
350
- result.push({
351
- ...node,
352
- [options.childField]: []
353
- });
354
- }
355
- }
356
- else {
357
- const { [options.childField]: _, ...other } = node;
358
- result.push(other);
359
- }
319
+ if (
320
+ !type.objectHas(filterCondition, 'filter') &&
321
+ (!type.objectHas(filterCondition, 'keyword') || type.isEmpty(filterCondition.keyword))
322
+ ) {
323
+ return nodes;
324
+ }
325
+ const result = [];
326
+ for (let i = 0, len = nodes.length; i < len; i++) {
327
+ const node = nodes[i];
328
+ // 递归检查子节点是否匹配
329
+ const matchedChildren =
330
+ node[options.childField] && node[options.childField].length > 0
331
+ ? fuzzySearchTree(node[options.childField] || [], filterCondition, options)
332
+ : [];
333
+ // 检查当前节点是否匹配或者有匹配的子节点
334
+ if (
335
+ (type.objectHas(filterCondition, 'filter')
336
+ ? filterCondition.filter(node)
337
+ : !options.ignoreCase
338
+ ? node[options.nameField].includes(filterCondition.keyword)
339
+ : node[options.nameField].toLowerCase().includes(filterCondition.keyword.toLowerCase())) ||
340
+ matchedChildren.length > 0
341
+ ) {
342
+ // 将当前节点加入结果中
343
+ if (node[options.childField]) {
344
+ if (matchedChildren.length > 0) {
345
+ result.push({
346
+ ...node,
347
+ [options.childField]: matchedChildren // 包含匹配的子节点
348
+ });
349
+ } else if (options.removeEmptyChild) {
350
+ const { [options.childField]: _, ...other } = node;
351
+ result.push(other);
352
+ } else {
353
+ result.push({
354
+ ...node,
355
+ [options.childField]: []
356
+ });
360
357
  }
358
+ } else {
359
+ const { [options.childField]: _, ...other } = node;
360
+ result.push(other);
361
+ }
361
362
  }
362
- return result;
363
+ }
364
+ return result;
363
365
  }
364
366
 
365
367
  exports.flatTree = flatTree;