tree-processor 0.6.2 → 0.7.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.
- package/README.md +400 -112
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/stats.html +1 -1
- package/dist/tree-processor.cjs.js +49 -31
- package/dist/tree-processor.esm.js +46 -28
- package/dist/tree-processor.umd.js +48 -30
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
一个轻量级的树结构数据处理工具库,使用 TypeScript 编写,支持 tree-shaking,每个格式打包体积约 **3-4 KB**(ESM: 3.25 KB,CJS: 3.42 KB,UMD: 3.56 KB)。
|
|
4
4
|
|
|
5
|
-
目前已支持 mapTree、forEachTree、filterTree、findTree、pushTree、unshiftTree、popTree、shiftTree、someTree、everyTree、includesTree、atTree、indexOfTree、atIndexOfTree、getParentTree、
|
|
5
|
+
目前已支持 mapTree、forEachTree、filterTree、findTree、pushTree、unshiftTree、popTree、shiftTree、someTree、everyTree、includesTree、atTree、indexOfTree、atIndexOfTree、dedupTree、removeTree、getParentTree、getChildrenTree、getSiblingsTree、getNodeDepthMap、getNodeDepth、isEmptyTreeData、isEmptySingleTreeData、isSingleTreeData 和 isTreeData。每个方法的最后一个参数可以自定义 children 和 id 的属性名。
|
|
6
6
|
|
|
7
7
|
## ✨ 特性
|
|
8
8
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
- 🎯 **类似数组 API** - 提供 map、filter、find 等熟悉的数组方法
|
|
13
13
|
- ⚙️ **自定义字段名** - 支持自定义 children 和 id 字段名
|
|
14
14
|
- ✅ **零依赖** - 无外部依赖,开箱即用
|
|
15
|
-
- 🧪 **完善的测试覆盖** - 包含
|
|
15
|
+
- 🧪 **完善的测试覆盖** - 包含 200 个测试用例,覆盖基础功能、边界情况、异常处理、复杂场景、npm 包导入等
|
|
16
16
|
|
|
17
17
|
## 📦 安装
|
|
18
18
|
|
|
@@ -54,6 +54,11 @@ const { mapTree, filterTree } = require('tree-processor')
|
|
|
54
54
|
- ✅ 更好的代码提示和类型检查
|
|
55
55
|
- ✅ 更清晰的依赖关系
|
|
56
56
|
|
|
57
|
+
**关于类型导入:**
|
|
58
|
+
- TypeScript 会自动从函数签名推断类型,**大多数情况下不需要显式引入类型**
|
|
59
|
+
- 只有在需要显式声明变量类型时才需要引入类型(如 `const treeData: TreeData = [...]`)
|
|
60
|
+
- 使用 `import type` 导入类型不会增加运行时体积(类型在编译时会被移除)
|
|
61
|
+
|
|
57
62
|
### 示例树结构数据
|
|
58
63
|
|
|
59
64
|
以下示例数据将用于后续所有方法的演示:
|
|
@@ -84,12 +89,23 @@ const treeData = [
|
|
|
84
89
|
|
|
85
90
|
### mapTree(遍历树结构数据的方法)
|
|
86
91
|
|
|
87
|
-
|
|
92
|
+
遍历树结构数据,对每个节点执行回调函数,返回映射后的数组。
|
|
88
93
|
|
|
89
94
|
```javascript
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
95
|
+
// 获取所有节点的名称
|
|
96
|
+
const nodeNames = t.mapTree(treeData, (node) => node.name)
|
|
97
|
+
console.log(nodeNames) // ['node1', 'node2', 'node4', 'node5', 'node3', 'node6']
|
|
98
|
+
|
|
99
|
+
// 获取所有节点的ID
|
|
100
|
+
const nodeIds = t.mapTree(treeData, (node) => node.id)
|
|
101
|
+
console.log(nodeIds) // [1, 2, 4, 5, 3, 6]
|
|
102
|
+
|
|
103
|
+
// 修改节点数据
|
|
104
|
+
const modifiedNodes = t.mapTree(treeData, (node) => ({
|
|
105
|
+
...node,
|
|
106
|
+
label: node.name
|
|
107
|
+
}))
|
|
108
|
+
console.log(modifiedNodes) // 返回包含 label 字段的新数组
|
|
93
109
|
```
|
|
94
110
|
|
|
95
111
|
### forEachTree(遍历树结构数据的方法,不返回值)
|
|
@@ -97,11 +113,23 @@ t.mapTree(treeData, (item) => {
|
|
|
97
113
|
遍历树结构数据,对每个节点执行回调函数。与 mapTree 的区别是不返回值,性能更好,适合只需要遍历而不需要返回结果的场景。
|
|
98
114
|
|
|
99
115
|
```javascript
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
116
|
+
// 遍历所有节点并打印
|
|
117
|
+
t.forEachTree(treeData, (node) => {
|
|
118
|
+
console.log(node)
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
// 修改节点属性
|
|
122
|
+
t.forEachTree(treeData, (node) => {
|
|
123
|
+
node.visited = true
|
|
124
|
+
node.timestamp = Date.now()
|
|
104
125
|
})
|
|
126
|
+
|
|
127
|
+
// 统计节点数量
|
|
128
|
+
let nodeCount = 0
|
|
129
|
+
t.forEachTree(treeData, () => {
|
|
130
|
+
nodeCount++
|
|
131
|
+
})
|
|
132
|
+
console.log(nodeCount) // 节点总数
|
|
105
133
|
```
|
|
106
134
|
|
|
107
135
|
### filterTree(树结构数据的filter方法)
|
|
@@ -109,84 +137,117 @@ t.forEachTree(treeData, (item) => {
|
|
|
109
137
|
过滤树结构数据,返回满足条件的节点。
|
|
110
138
|
|
|
111
139
|
```javascript
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
return
|
|
140
|
+
// 过滤出名称包含 'node' 的节点
|
|
141
|
+
const filteredNodes = t.filterTree(treeData, (node) => {
|
|
142
|
+
return node.name.includes('node')
|
|
115
143
|
})
|
|
144
|
+
console.log(filteredNodes) // 返回满足条件的节点数组
|
|
116
145
|
|
|
117
|
-
|
|
146
|
+
// 过滤出ID大于2的节点
|
|
147
|
+
const nodesWithLargeId = t.filterTree(treeData, (node) => node.id > 2)
|
|
148
|
+
console.log(nodesWithLargeId) // 返回ID大于2的节点数组
|
|
149
|
+
|
|
150
|
+
// 过滤出没有子节点的节点(叶子节点)
|
|
151
|
+
const leafNodes = t.filterTree(treeData, (node) => {
|
|
152
|
+
return !node.children || node.children.length === 0
|
|
153
|
+
})
|
|
154
|
+
console.log(leafNodes) // 返回所有叶子节点
|
|
118
155
|
```
|
|
119
156
|
|
|
120
157
|
### findTree(树结构数据的find方法)
|
|
121
158
|
|
|
122
|
-
|
|
159
|
+
查找树结构数据中满足条件的第一个节点。如果未找到,返回 null。
|
|
123
160
|
|
|
124
161
|
```javascript
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
162
|
+
// 查找ID为2的节点
|
|
163
|
+
const foundNode = t.findTree(treeData, (node) => node.id === 2)
|
|
164
|
+
console.log(foundNode) // 返回找到的节点对象,未找到返回 null
|
|
165
|
+
|
|
166
|
+
// 查找名称为 'node3' 的节点
|
|
167
|
+
const node3 = t.findTree(treeData, (node) => node.name === 'node3')
|
|
168
|
+
console.log(node3) // { id: 3, name: 'node3', children: [...] }
|
|
128
169
|
|
|
129
|
-
|
|
170
|
+
// 查找不存在的节点
|
|
171
|
+
const nodeNotFound = t.findTree(treeData, (node) => node.id === 999)
|
|
172
|
+
console.log(nodeNotFound) // null
|
|
130
173
|
```
|
|
131
174
|
|
|
132
175
|
### pushTree(在指定节点下添加子节点到末尾)
|
|
133
176
|
|
|
134
|
-
|
|
177
|
+
在指定节点下添加子节点到末尾。返回 true 表示添加成功,false 表示未找到目标节点。
|
|
135
178
|
|
|
136
179
|
```javascript
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
console.log(
|
|
180
|
+
// 在ID为1的节点下添加新子节点
|
|
181
|
+
const addSuccess = t.pushTree(treeData, 1, { id: 7, name: 'node7' })
|
|
182
|
+
console.log(addSuccess) // true
|
|
183
|
+
console.log(treeData) // 新节点已添加到 children 数组末尾
|
|
184
|
+
|
|
185
|
+
// 尝试在不存在的节点下添加
|
|
186
|
+
const addFailed = t.pushTree(treeData, 999, { id: 8, name: 'node8' })
|
|
187
|
+
console.log(addFailed) // false,未找到目标节点
|
|
140
188
|
```
|
|
141
189
|
|
|
142
190
|
### unshiftTree(在指定节点下添加子节点到开头)
|
|
143
191
|
|
|
144
|
-
|
|
192
|
+
在指定节点下添加子节点到开头。返回 true 表示添加成功,false 表示未找到目标节点。
|
|
145
193
|
|
|
146
194
|
```javascript
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
console.log(
|
|
195
|
+
// 在ID为1的节点下添加新子节点到开头
|
|
196
|
+
const unshiftSuccess = t.unshiftTree(treeData, 1, { id: 7, name: 'node7' })
|
|
197
|
+
console.log(unshiftSuccess) // true
|
|
198
|
+
console.log(treeData) // 新节点已添加到 children 数组开头
|
|
150
199
|
```
|
|
151
200
|
|
|
152
201
|
### popTree(删除指定节点下的最后一个子节点)
|
|
153
202
|
|
|
154
|
-
|
|
203
|
+
删除指定节点下的最后一个子节点。返回被删除的节点,如果节点不存在或没有子节点则返回 false。
|
|
155
204
|
|
|
156
205
|
```javascript
|
|
157
|
-
|
|
206
|
+
// 删除ID为1的节点下的最后一个子节点
|
|
207
|
+
const removedNode = t.popTree(treeData, 1)
|
|
208
|
+
console.log(removedNode) // 返回被删除的节点对象,或 false
|
|
158
209
|
|
|
159
|
-
|
|
210
|
+
// 尝试删除不存在的节点下的子节点
|
|
211
|
+
const popFailed = t.popTree(treeData, 999)
|
|
212
|
+
console.log(popFailed) // false
|
|
160
213
|
```
|
|
161
214
|
|
|
162
215
|
### shiftTree(删除指定节点下的第一个子节点)
|
|
163
216
|
|
|
164
|
-
|
|
217
|
+
删除指定节点下的第一个子节点。返回被删除的节点,如果节点不存在或没有子节点则返回 false。
|
|
165
218
|
|
|
166
219
|
```javascript
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
console.log(
|
|
220
|
+
// 删除ID为1的节点下的第一个子节点
|
|
221
|
+
const shiftedNode = t.shiftTree(treeData, 1)
|
|
222
|
+
console.log(shiftedNode) // 返回被删除的节点对象,或 false
|
|
170
223
|
```
|
|
171
224
|
|
|
172
225
|
### someTree(树结构数据的some方法)
|
|
173
226
|
|
|
174
|
-
|
|
227
|
+
检查树结构数据中是否存在满足条件的节点。只要有一个节点满足条件就返回 true。
|
|
175
228
|
|
|
176
229
|
```javascript
|
|
177
|
-
|
|
230
|
+
// 检查是否存在名称为 'node2' 的节点
|
|
231
|
+
const hasNode2 = t.someTree(treeData, node => node.name === 'node2')
|
|
232
|
+
console.log(hasNode2) // true
|
|
178
233
|
|
|
179
|
-
|
|
234
|
+
// 检查是否存在ID大于10的节点
|
|
235
|
+
const hasLargeId = t.someTree(treeData, node => node.id > 10)
|
|
236
|
+
console.log(hasLargeId) // false
|
|
180
237
|
```
|
|
181
238
|
|
|
182
239
|
### everyTree(树结构数据的every方法)
|
|
183
240
|
|
|
184
|
-
|
|
241
|
+
检查树结构数据中是否所有节点都满足条件。只有所有节点都满足条件才返回 true。
|
|
185
242
|
|
|
186
243
|
```javascript
|
|
187
|
-
|
|
244
|
+
// 检查所有节点的ID是否都大于0
|
|
245
|
+
const allIdsPositive = t.everyTree(treeData, node => node.id > 0)
|
|
246
|
+
console.log(allIdsPositive) // true
|
|
188
247
|
|
|
189
|
-
|
|
248
|
+
// 检查所有节点是否都有 name 属性
|
|
249
|
+
const allHaveName = t.everyTree(treeData, node => node.name)
|
|
250
|
+
console.log(allHaveName) // 根据实际数据返回 true 或 false
|
|
190
251
|
```
|
|
191
252
|
|
|
192
253
|
### includesTree(检查树中是否包含指定节点)
|
|
@@ -194,146 +255,370 @@ console.log(result)
|
|
|
194
255
|
检查树结构数据中是否包含指定ID的节点。
|
|
195
256
|
|
|
196
257
|
```javascript
|
|
197
|
-
const
|
|
258
|
+
const nodeId = 2
|
|
259
|
+
const hasNode = t.includesTree(treeData, nodeId)
|
|
198
260
|
|
|
199
261
|
console.log(hasNode) // true 表示包含该节点,false 表示不包含
|
|
200
262
|
```
|
|
201
263
|
|
|
202
264
|
### atTree(根据父节点ID和子节点索引获取节点)
|
|
203
265
|
|
|
204
|
-
|
|
266
|
+
根据父节点ID和子节点索引获取节点。支持负数索引,和数组的 at 方法一样。未找到返回 null。
|
|
205
267
|
|
|
206
268
|
```javascript
|
|
207
|
-
|
|
269
|
+
// 获取ID为1的节点的第一个子节点(索引0)
|
|
270
|
+
const firstChildNode = t.atTree(treeData, 1, 0)
|
|
271
|
+
console.log(firstChildNode) // 返回第一个子节点
|
|
272
|
+
|
|
273
|
+
// 获取最后一个子节点(负数索引)
|
|
274
|
+
const lastChildNode = t.atTree(treeData, 1, -1)
|
|
275
|
+
console.log(lastChildNode) // 返回最后一个子节点
|
|
208
276
|
|
|
209
|
-
|
|
277
|
+
// 索引超出范围返回 null
|
|
278
|
+
const nodeNotFound = t.atTree(treeData, 1, 10)
|
|
279
|
+
console.log(nodeNotFound) // null
|
|
210
280
|
```
|
|
211
281
|
|
|
212
282
|
### indexOfTree(返回从根节点到目标节点的索引路径)
|
|
213
283
|
|
|
214
|
-
返回一个数组,值为从根节点开始到 targetId
|
|
284
|
+
返回一个数组,值为从根节点开始到 targetId 所在节点的索引路径。未找到返回 null。返回值可以传入 atIndexOfTree 的第二个参数进行取值。
|
|
215
285
|
|
|
216
286
|
```javascript
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
console.log(
|
|
287
|
+
// 获取ID为4的节点的索引路径
|
|
288
|
+
const nodePath = t.indexOfTree(treeData, 4)
|
|
289
|
+
console.log(nodePath) // [0, 0, 0] 表示根节点 -> 第一个子节点 -> 第一个子节点
|
|
290
|
+
|
|
291
|
+
// 未找到节点返回 null
|
|
292
|
+
const pathNotFound = t.indexOfTree(treeData, 999)
|
|
293
|
+
console.log(pathNotFound) // null
|
|
294
|
+
|
|
295
|
+
// 结合 atIndexOfTree 使用
|
|
296
|
+
const indexPath = t.indexOfTree(treeData, 4)
|
|
297
|
+
const nodeByPath = t.atIndexOfTree(treeData, indexPath)
|
|
298
|
+
console.log(nodeByPath) // 获取到ID为4的节点
|
|
220
299
|
```
|
|
221
300
|
|
|
222
301
|
### atIndexOfTree(根据索引路径获取节点)
|
|
223
302
|
|
|
224
|
-
|
|
303
|
+
根据索引路径获取节点。路径无效或超出范围返回 null。
|
|
225
304
|
|
|
226
305
|
```javascript
|
|
227
|
-
|
|
306
|
+
// 根据索引路径获取节点
|
|
307
|
+
const nodeByIndexPath = t.atIndexOfTree(treeData, [0, 1, 0])
|
|
308
|
+
console.log(nodeByIndexPath) // 返回对应路径的节点对象
|
|
309
|
+
|
|
310
|
+
// 结合 indexOfTree 使用
|
|
311
|
+
const targetPath = t.indexOfTree(treeData, 4)
|
|
312
|
+
const targetNode = t.atIndexOfTree(treeData, targetPath)
|
|
313
|
+
console.log(targetNode) // 获取到ID为4的节点
|
|
314
|
+
|
|
315
|
+
// 路径无效返回 null
|
|
316
|
+
const invalidPath = t.atIndexOfTree(treeData, [999])
|
|
317
|
+
console.log(invalidPath) // null
|
|
318
|
+
```
|
|
228
319
|
|
|
229
|
-
|
|
320
|
+
### dedupTree(树结构对象数组去重方法)
|
|
321
|
+
|
|
322
|
+
树结构对象数组去重方法,根据指定的键去除重复节点。保留第一次出现的节点。
|
|
323
|
+
|
|
324
|
+
```javascript
|
|
325
|
+
// 根据 id 字段去重
|
|
326
|
+
const uniqueTreeData = t.dedupTree(treeData, 'id')
|
|
327
|
+
console.log(uniqueTreeData) // 返回去重后的树结构数据
|
|
328
|
+
|
|
329
|
+
// 根据 name 字段去重
|
|
330
|
+
const uniqueByNameTree = t.dedupTree(treeData, 'name')
|
|
331
|
+
console.log(uniqueByNameTree) // 返回根据 name 去重后的数据
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### removeTree(删除指定节点)
|
|
335
|
+
|
|
336
|
+
删除树结构数据中指定ID的节点,包括根节点和子节点。
|
|
337
|
+
|
|
338
|
+
```javascript
|
|
339
|
+
const nodeIdToRemove = 2
|
|
340
|
+
const removeSuccess = t.removeTree(treeData, nodeIdToRemove)
|
|
341
|
+
|
|
342
|
+
console.log(removeSuccess) // true 表示删除成功,false 表示未找到节点
|
|
343
|
+
console.log(treeData) // 删除后的树结构
|
|
230
344
|
```
|
|
231
345
|
|
|
232
346
|
### getParentTree(获取节点的父节点)
|
|
233
347
|
|
|
234
|
-
|
|
348
|
+
获取指定节点的父节点。如果节点是根节点或未找到,返回 null。
|
|
235
349
|
|
|
236
350
|
```javascript
|
|
237
|
-
|
|
351
|
+
// 获取ID为2的节点的父节点
|
|
352
|
+
const parentNode = t.getParentTree(treeData, 2)
|
|
353
|
+
console.log(parentNode) // 返回父节点对象 { id: 1, name: 'node1', ... }
|
|
354
|
+
|
|
355
|
+
// 根节点没有父节点,返回 null
|
|
356
|
+
const rootParentNode = t.getParentTree(treeData, 1)
|
|
357
|
+
console.log(rootParentNode) // null
|
|
238
358
|
|
|
239
|
-
|
|
359
|
+
// 未找到节点返回 null
|
|
360
|
+
const parentNotFound = t.getParentTree(treeData, 999)
|
|
361
|
+
console.log(parentNotFound) // null
|
|
240
362
|
```
|
|
241
363
|
|
|
242
|
-
###
|
|
364
|
+
### getChildrenTree(获取节点的所有直接子节点)
|
|
243
365
|
|
|
244
|
-
|
|
366
|
+
获取指定节点的所有直接子节点。如果未找到节点或没有子节点,返回空数组。
|
|
245
367
|
|
|
246
368
|
```javascript
|
|
247
|
-
|
|
369
|
+
// 获取ID为1的节点的所有子节点
|
|
370
|
+
const children = t.getChildrenTree(treeData, 1)
|
|
371
|
+
console.log(children) // 返回子节点数组 [{ id: 2, ... }, { id: 3, ... }]
|
|
248
372
|
|
|
249
|
-
|
|
373
|
+
// 节点没有子节点,返回空数组
|
|
374
|
+
const emptyChildren = t.getChildrenTree(treeData, 4)
|
|
375
|
+
console.log(emptyChildren) // []
|
|
376
|
+
|
|
377
|
+
// 未找到节点返回空数组
|
|
378
|
+
const notFound = t.getChildrenTree(treeData, 999)
|
|
379
|
+
console.log(notFound) // []
|
|
380
|
+
|
|
381
|
+
// 支持自定义字段名
|
|
382
|
+
const customTree = [
|
|
383
|
+
{
|
|
384
|
+
nodeId: 1,
|
|
385
|
+
name: 'root',
|
|
386
|
+
subNodes: [
|
|
387
|
+
{ nodeId: 2, name: 'child1' },
|
|
388
|
+
{ nodeId: 3, name: 'child2' },
|
|
389
|
+
],
|
|
390
|
+
},
|
|
391
|
+
];
|
|
392
|
+
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
393
|
+
const customChildren = t.getChildrenTree(customTree, 1, fieldNames)
|
|
394
|
+
console.log(customChildren) // 返回子节点数组
|
|
250
395
|
```
|
|
251
396
|
|
|
252
|
-
###
|
|
397
|
+
### getSiblingsTree(获取节点的所有兄弟节点)
|
|
253
398
|
|
|
254
|
-
|
|
399
|
+
获取指定节点的所有兄弟节点(包括自己)。如果未找到节点,返回空数组。根节点的兄弟节点是其他根节点。
|
|
255
400
|
|
|
256
401
|
```javascript
|
|
257
|
-
|
|
402
|
+
// 获取ID为2的节点的所有兄弟节点(包括自己)
|
|
403
|
+
const siblings = t.getSiblingsTree(treeData, 2)
|
|
404
|
+
console.log(siblings) // 返回兄弟节点数组 [{ id: 2, ... }, { id: 3, ... }]
|
|
405
|
+
|
|
406
|
+
// 根节点的兄弟节点是其他根节点
|
|
407
|
+
const multiRoot = [
|
|
408
|
+
{ id: 1, children: [{ id: 2 }] },
|
|
409
|
+
{ id: 3, children: [{ id: 4 }] },
|
|
410
|
+
];
|
|
411
|
+
const rootSiblings = t.getSiblingsTree(multiRoot, 1)
|
|
412
|
+
console.log(rootSiblings) // 返回所有根节点 [{ id: 1, ... }, { id: 3, ... }]
|
|
258
413
|
|
|
259
|
-
|
|
414
|
+
// 未找到节点返回空数组
|
|
415
|
+
const notFound = t.getSiblingsTree(treeData, 999)
|
|
416
|
+
console.log(notFound) // []
|
|
417
|
+
|
|
418
|
+
// 支持自定义字段名
|
|
419
|
+
const customTree = [
|
|
420
|
+
{
|
|
421
|
+
nodeId: 1,
|
|
422
|
+
name: 'root',
|
|
423
|
+
subNodes: [
|
|
424
|
+
{ nodeId: 2, name: 'child1' },
|
|
425
|
+
{ nodeId: 3, name: 'child2' },
|
|
426
|
+
{ nodeId: 4, name: 'child3' },
|
|
427
|
+
],
|
|
428
|
+
},
|
|
429
|
+
];
|
|
430
|
+
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
431
|
+
const customSiblings = t.getSiblingsTree(customTree, 2, fieldNames)
|
|
432
|
+
console.log(customSiblings) // 返回兄弟节点数组(包括自己)
|
|
260
433
|
```
|
|
261
434
|
|
|
262
|
-
###
|
|
435
|
+
### getNodeDepthMap(返回节点ID到深度的映射)
|
|
263
436
|
|
|
264
|
-
|
|
437
|
+
返回一个字典,键代表节点的 id,值代表该节点在数据的第几层。深度从1开始,根节点深度为1。
|
|
265
438
|
|
|
266
439
|
```javascript
|
|
267
|
-
|
|
440
|
+
// 获取所有节点的深度映射
|
|
441
|
+
const nodeDepthMap = t.getNodeDepthMap(treeData)
|
|
442
|
+
console.log(nodeDepthMap) // { 1: 1, 2: 2, 3: 2, 4: 3, 5: 3, 6: 3 }
|
|
268
443
|
|
|
269
|
-
|
|
270
|
-
|
|
444
|
+
// 获取特定节点的深度
|
|
445
|
+
const node2Depth = nodeDepthMap[2]
|
|
446
|
+
console.log(node2Depth) // 2
|
|
447
|
+
|
|
448
|
+
// 空树返回空对象
|
|
449
|
+
const emptyDepthMap = t.getNodeDepthMap([])
|
|
450
|
+
console.log(emptyDepthMap) // {}
|
|
271
451
|
```
|
|
272
452
|
|
|
273
|
-
###
|
|
453
|
+
### getNodeDepth(获取单个节点的深度)
|
|
274
454
|
|
|
275
|
-
|
|
455
|
+
获取指定节点的深度。深度从1开始,根节点深度为1。
|
|
276
456
|
|
|
277
457
|
```javascript
|
|
278
|
-
|
|
458
|
+
// 获取根节点的深度
|
|
459
|
+
const rootDepth = t.getNodeDepth(treeData, 1)
|
|
460
|
+
console.log(rootDepth) // 1
|
|
461
|
+
|
|
462
|
+
// 获取子节点的深度
|
|
463
|
+
const childDepth = t.getNodeDepth(treeData, 2)
|
|
464
|
+
console.log(childDepth) // 2
|
|
279
465
|
|
|
280
|
-
|
|
466
|
+
// 获取深层节点的深度
|
|
467
|
+
const deepDepth = t.getNodeDepth(treeData, 4)
|
|
468
|
+
console.log(deepDepth) // 3
|
|
469
|
+
|
|
470
|
+
// 未找到节点返回 null
|
|
471
|
+
const notFound = t.getNodeDepth(treeData, 999)
|
|
472
|
+
console.log(notFound) // null
|
|
473
|
+
|
|
474
|
+
// 支持自定义字段名
|
|
475
|
+
const customTree = [
|
|
476
|
+
{
|
|
477
|
+
nodeId: 1,
|
|
478
|
+
name: 'root',
|
|
479
|
+
subNodes: [
|
|
480
|
+
{ nodeId: 2, name: 'child' },
|
|
481
|
+
],
|
|
482
|
+
},
|
|
483
|
+
];
|
|
484
|
+
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
485
|
+
const depth = t.getNodeDepth(customTree, 2, fieldNames)
|
|
486
|
+
console.log(depth) // 2
|
|
281
487
|
```
|
|
282
488
|
|
|
283
|
-
|
|
489
|
+
**与 getNodeDepthMap 的区别:**
|
|
490
|
+
- `getNodeDepthMap` - 批量获取所有节点的深度(一次性计算所有节点)
|
|
491
|
+
- `getNodeDepth` - 只获取单个节点的深度(只计算目标节点,效率更高)
|
|
492
|
+
|
|
493
|
+
### isEmptyTreeData(检查树结构数据是否为空)
|
|
284
494
|
|
|
285
|
-
|
|
495
|
+
检查树结构数据(数组)是否为空。空数组、null、undefined 都视为空。此函数支持 fieldNames 参数以保持 API 一致性,但该参数不生效(因为只检查数组是否为空,不访问 children 或 id 字段)。
|
|
286
496
|
|
|
287
497
|
```javascript
|
|
288
|
-
//
|
|
289
|
-
const
|
|
498
|
+
// 检查树结构数据是否为空
|
|
499
|
+
const isEmptyTree = t.isEmptyTreeData(treeData)
|
|
500
|
+
console.log(isEmptyTree) // false(有数据)
|
|
501
|
+
|
|
502
|
+
// 空数组返回 true
|
|
503
|
+
const isEmptyArray = t.isEmptyTreeData([])
|
|
504
|
+
console.log(isEmptyArray) // true
|
|
505
|
+
|
|
506
|
+
// null 或 undefined 返回 true
|
|
507
|
+
const isNullTree = t.isEmptyTreeData(null)
|
|
508
|
+
console.log(isNullTree) // true
|
|
509
|
+
|
|
510
|
+
// 支持 fieldNames 参数(保持 API 一致性,但不生效)
|
|
511
|
+
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
512
|
+
const isEmptyWithFieldNames = t.isEmptyTreeData(treeData, fieldNames)
|
|
513
|
+
console.log(isEmptyWithFieldNames) // false(结果与不传 fieldNames 相同)
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### isEmptySingleTreeData(检查单个树结构数据是否为空)
|
|
517
|
+
|
|
518
|
+
检查单个树结构数据是否为空。如果数据不是有效的单个树结构数据、没有 children 字段,或者 children 是空数组,则视为空。如果有子节点(children 数组不为空),即使子节点本身是空的,树也不为空。
|
|
519
|
+
|
|
520
|
+
```javascript
|
|
521
|
+
// 没有 children 字段,视为空
|
|
522
|
+
const tree1 = { id: 1, name: 'node1' };
|
|
523
|
+
const isEmpty1 = t.isEmptySingleTreeData(tree1)
|
|
524
|
+
console.log(isEmpty1) // true
|
|
525
|
+
|
|
526
|
+
// children 是空数组,视为空
|
|
527
|
+
const tree2 = {
|
|
528
|
+
id: 1,
|
|
529
|
+
name: 'node1',
|
|
530
|
+
children: [],
|
|
531
|
+
};
|
|
532
|
+
const isEmpty2 = t.isEmptySingleTreeData(tree2)
|
|
533
|
+
console.log(isEmpty2) // true
|
|
534
|
+
|
|
535
|
+
// 有子节点,不为空
|
|
536
|
+
const tree3 = {
|
|
290
537
|
id: 1,
|
|
291
538
|
name: 'node1',
|
|
292
539
|
children: [
|
|
293
540
|
{ id: 2, name: 'node2' },
|
|
294
|
-
{ id: 3, name: 'node3' },
|
|
295
541
|
],
|
|
296
542
|
};
|
|
543
|
+
const isEmpty3 = t.isEmptySingleTreeData(tree3)
|
|
544
|
+
console.log(isEmpty3) // false
|
|
297
545
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
// 无效的树结构
|
|
302
|
-
const invalidTree = {
|
|
546
|
+
// 有子节点,即使子节点本身是空的,树也不为空
|
|
547
|
+
const tree4 = {
|
|
303
548
|
id: 1,
|
|
304
|
-
|
|
549
|
+
name: 'node1',
|
|
550
|
+
children: [
|
|
551
|
+
{ id: 2, name: 'node2', children: [] },
|
|
552
|
+
{ id: 3, name: 'node3' }, // 没有children字段
|
|
553
|
+
],
|
|
305
554
|
};
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
console.log(isInvalid) // false
|
|
555
|
+
const isEmpty4 = t.isEmptySingleTreeData(tree4)
|
|
556
|
+
console.log(isEmpty4) // false(因为有子节点,即使子节点是空的)
|
|
309
557
|
|
|
310
558
|
// 支持自定义字段名
|
|
311
559
|
const customTree = {
|
|
312
560
|
nodeId: 1,
|
|
313
561
|
name: 'node1',
|
|
314
|
-
subNodes: [
|
|
315
|
-
|
|
562
|
+
subNodes: [],
|
|
563
|
+
};
|
|
564
|
+
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
565
|
+
const isEmptyCustom = t.isEmptySingleTreeData(customTree, fieldNames)
|
|
566
|
+
console.log(isEmptyCustom) // true
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### isSingleTreeData(判断数据是否是单个树结构数据)
|
|
570
|
+
|
|
571
|
+
判断数据是否是单个树结构数据(单个对象)。树结构数据必须是一个对象(不能是数组、null、undefined 或基本类型),如果存在 children 字段,必须是数组类型,并且会递归检查所有子节点。
|
|
572
|
+
|
|
573
|
+
```javascript
|
|
574
|
+
// 有效的单个树结构数据
|
|
575
|
+
const tree = {
|
|
576
|
+
id: 1,
|
|
577
|
+
name: 'node1',
|
|
578
|
+
children: [
|
|
579
|
+
{ id: 2, name: 'node2' },
|
|
580
|
+
{ id: 3, name: 'node3' },
|
|
316
581
|
],
|
|
317
582
|
};
|
|
583
|
+
const isValid = t.isSingleTreeData(tree)
|
|
584
|
+
console.log(isValid) // true
|
|
585
|
+
|
|
586
|
+
// 没有 children 字段也是有效的(只有根节点)
|
|
587
|
+
const singleNode = { id: 1, name: 'node1' }
|
|
588
|
+
console.log(t.isSingleTreeData(singleNode)) // true
|
|
589
|
+
|
|
590
|
+
// 数组不是单个树结构数据
|
|
591
|
+
console.log(t.isSingleTreeData([])) // false
|
|
318
592
|
|
|
593
|
+
// null 或 undefined 不是有效的树结构数据
|
|
594
|
+
console.log(t.isSingleTreeData(null)) // false
|
|
595
|
+
console.log(t.isSingleTreeData(undefined)) // false
|
|
596
|
+
|
|
597
|
+
// children 不能是 null
|
|
598
|
+
const invalidTree = { id: 1, children: null }
|
|
599
|
+
console.log(t.isSingleTreeData(invalidTree)) // false
|
|
600
|
+
|
|
601
|
+
// 支持自定义字段名
|
|
602
|
+
const customTree = {
|
|
603
|
+
nodeId: 1,
|
|
604
|
+
name: 'node1',
|
|
605
|
+
subNodes: [{ nodeId: 2, name: 'node2' }],
|
|
606
|
+
};
|
|
319
607
|
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
320
|
-
|
|
321
|
-
console.log(isValidCustom) // true
|
|
608
|
+
console.log(t.isSingleTreeData(customTree, fieldNames)) // true
|
|
322
609
|
```
|
|
323
610
|
|
|
324
|
-
###
|
|
611
|
+
### isTreeData(判断数据是否是树结构数据)
|
|
325
612
|
|
|
326
|
-
|
|
613
|
+
判断数据是否是树结构数据(数组)。树结构数据必须是一个数组,数组中的每个元素都必须是有效的单个树结构数据。
|
|
327
614
|
|
|
328
615
|
```javascript
|
|
329
|
-
//
|
|
616
|
+
// 有效的树结构数据(森林)
|
|
330
617
|
const forest = [
|
|
331
618
|
{
|
|
332
619
|
id: 1,
|
|
333
620
|
name: 'node1',
|
|
334
|
-
children: [
|
|
335
|
-
{ id: 2, name: 'node2' },
|
|
336
|
-
],
|
|
621
|
+
children: [{ id: 2, name: 'node2' }],
|
|
337
622
|
},
|
|
338
623
|
{
|
|
339
624
|
id: 3,
|
|
@@ -341,38 +626,35 @@ const forest = [
|
|
|
341
626
|
children: [{ id: 4, name: 'node4' }],
|
|
342
627
|
},
|
|
343
628
|
];
|
|
629
|
+
console.log(t.isTreeData(forest)) // true
|
|
344
630
|
|
|
345
|
-
|
|
346
|
-
console.log(
|
|
631
|
+
// 空数组也是有效的树结构数据(空森林)
|
|
632
|
+
console.log(t.isTreeData([])) // true
|
|
347
633
|
|
|
348
|
-
//
|
|
349
|
-
|
|
350
|
-
const isEmptyValid = t.isMultipleTrees(emptyForest)
|
|
351
|
-
console.log(isEmptyValid) // true
|
|
634
|
+
// 单个对象不是树结构数据(应该用 isSingleTreeData)
|
|
635
|
+
console.log(t.isTreeData({ id: 1 })) // false
|
|
352
636
|
|
|
353
|
-
//
|
|
637
|
+
// 数组包含非树结构元素,返回 false
|
|
354
638
|
const invalidForest = [
|
|
355
639
|
{ id: 1, children: [{ id: 2 }] },
|
|
356
|
-
'not a tree', //
|
|
640
|
+
'not a tree', // 无效元素
|
|
357
641
|
];
|
|
642
|
+
console.log(t.isTreeData(invalidForest)) // false
|
|
358
643
|
|
|
359
|
-
|
|
360
|
-
console.log(
|
|
644
|
+
// null 或 undefined 不是有效的树结构数据
|
|
645
|
+
console.log(t.isTreeData(null)) // false
|
|
646
|
+
console.log(t.isTreeData(undefined)) // false
|
|
361
647
|
|
|
362
648
|
// 支持自定义字段名
|
|
363
649
|
const customForest = [
|
|
364
650
|
{
|
|
365
651
|
nodeId: 1,
|
|
366
652
|
name: 'node1',
|
|
367
|
-
subNodes: [
|
|
368
|
-
{ nodeId: 2, name: 'node2' },
|
|
369
|
-
],
|
|
653
|
+
subNodes: [{ nodeId: 2, name: 'node2' }],
|
|
370
654
|
},
|
|
371
655
|
];
|
|
372
|
-
|
|
373
656
|
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
374
|
-
|
|
375
|
-
console.log(isValidCustom) // true
|
|
657
|
+
console.log(t.isTreeData(customForest, fieldNames)) // true
|
|
376
658
|
```
|
|
377
659
|
|
|
378
660
|
## 自定义字段名
|
|
@@ -380,10 +662,16 @@ console.log(isValidCustom) // true
|
|
|
380
662
|
所有方法都支持自定义 children 和 id 的属性名,通过最后一个参数传入配置对象:
|
|
381
663
|
|
|
382
664
|
```javascript
|
|
665
|
+
// 使用默认字段名
|
|
666
|
+
const foundNode1 = t.findTree(treeData, (node) => node.id === 2)
|
|
667
|
+
|
|
668
|
+
// 使用自定义字段名
|
|
383
669
|
const fieldNames = { children: 'subNodes', id: 'nodeId' };
|
|
384
|
-
const
|
|
670
|
+
const foundNode2 = t.findTree(customTreeData, (node) => node.nodeId === 2, fieldNames);
|
|
385
671
|
```
|
|
386
672
|
|
|
673
|
+
**注意:** 所有 25 个函数都支持 `fieldNames` 参数,保持 API 一致性。即使某些函数(如 `isEmptyTreeData`)中该参数不生效,也可以传入以保持代码风格一致。
|
|
674
|
+
|
|
387
675
|
## 测试
|
|
388
676
|
|
|
389
677
|
### 运行测试
|
package/dist/index.d.ts
CHANGED
|
@@ -16,15 +16,19 @@ export declare function everyTree(tree: TreeData, filterFn: (node: TreeNode) =>
|
|
|
16
16
|
export declare function atTree(tree: TreeData, parentId: any, nodeIndex: number, fieldNames?: FieldNames): TreeNode | null;
|
|
17
17
|
export declare function indexOfTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): number[] | null;
|
|
18
18
|
export declare function atIndexOfTree(tree: TreeData, path: number[], fieldNames?: FieldNames): TreeNode | null;
|
|
19
|
-
export declare function
|
|
19
|
+
export declare function getNodeDepthMap(tree: TreeData, fieldNames?: FieldNames): Record<string, number>;
|
|
20
|
+
export declare function getNodeDepth(tree: TreeData, targetId: any, fieldNames?: FieldNames): number | null;
|
|
20
21
|
export declare function dedupTree(tree: TreeData, key: string, fieldNames?: FieldNames): TreeData;
|
|
21
22
|
export declare function removeTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): boolean;
|
|
22
23
|
export declare function forEachTree(tree: TreeData, callback: (node: TreeNode) => void, fieldNames?: FieldNames): void;
|
|
23
|
-
export declare function
|
|
24
|
+
export declare function isEmptyTreeData(tree: TreeData, fieldNames?: FieldNames): boolean;
|
|
25
|
+
export declare function isEmptySingleTreeData(data: any, fieldNames?: FieldNames): boolean;
|
|
26
|
+
export declare function getChildrenTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): TreeNode[];
|
|
27
|
+
export declare function getSiblingsTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): TreeNode[];
|
|
24
28
|
export declare function getParentTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): TreeNode | null;
|
|
25
29
|
export declare function includesTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): boolean;
|
|
26
|
-
export declare function
|
|
27
|
-
export declare function
|
|
30
|
+
export declare function isSingleTreeData(data: any, fieldNames?: FieldNames): boolean;
|
|
31
|
+
export declare function isTreeData(data: any, fieldNames?: FieldNames): boolean;
|
|
28
32
|
declare const treeProcessor: {
|
|
29
33
|
mapTree: typeof mapTree;
|
|
30
34
|
filterTree: typeof filterTree;
|
|
@@ -38,15 +42,19 @@ declare const treeProcessor: {
|
|
|
38
42
|
atTree: typeof atTree;
|
|
39
43
|
indexOfTree: typeof indexOfTree;
|
|
40
44
|
atIndexOfTree: typeof atIndexOfTree;
|
|
41
|
-
|
|
45
|
+
getNodeDepthMap: typeof getNodeDepthMap;
|
|
46
|
+
getNodeDepth: typeof getNodeDepth;
|
|
42
47
|
dedupTree: typeof dedupTree;
|
|
43
48
|
removeTree: typeof removeTree;
|
|
44
49
|
forEachTree: typeof forEachTree;
|
|
45
|
-
|
|
50
|
+
isEmptyTreeData: typeof isEmptyTreeData;
|
|
51
|
+
isEmptySingleTreeData: typeof isEmptySingleTreeData;
|
|
46
52
|
getParentTree: typeof getParentTree;
|
|
53
|
+
getChildrenTree: typeof getChildrenTree;
|
|
54
|
+
getSiblingsTree: typeof getSiblingsTree;
|
|
47
55
|
includesTree: typeof includesTree;
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
isSingleTreeData: typeof isSingleTreeData;
|
|
57
|
+
isTreeData: typeof isTreeData;
|
|
50
58
|
};
|
|
51
59
|
export default treeProcessor;
|
|
52
60
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ;AAaD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAK3C,MAAM,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;AASlC,wBAAgB,OAAO,CACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,GAAG,EACjC,UAAU,GAAE,UAAgC,GAC3C,GAAG,EAAE,CAeP;AASD,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,EACpD,UAAU,GAAE,UAAgC,GAC3C,QAAQ,CAiBV;AASD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,EACxC,UAAU,GAAE,UAAgC,GAC3C,QAAQ,GAAG,IAAI,CAcjB;AAUD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,GAAG,EACnB,OAAO,EAAE,QAAQ,EACjB,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAqBT;AAUD,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,GAAG,EACnB,OAAO,EAAE,QAAQ,EACjB,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAqBT;AASD,wBAAgB,OAAO,CACrB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,GAAG,EACX,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAsBT;AASD,wBAAgB,SAAS,CACvB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,GAAG,EACX,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAsBT;AASD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,EACrC,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAaT;AASD,wBAAgB,SAAS,CACvB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,EACrC,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAaT;AAUD,wBAAgB,MAAM,CACpB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,UAAgC,GAC3C,QAAQ,GAAG,IAAI,CAqCjB;AASD,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,EACb,UAAU,GAAE,UAAgC,GAC3C,MAAM,EAAE,GAAG,IAAI,CAsBjB;AASD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EAAE,EACd,UAAU,GAAE,UAAgC,GAC3C,QAAQ,GAAG,IAAI,CA4BjB;AAQD,wBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/stats.html
CHANGED
|
@@ -4929,7 +4929,7 @@ var drawChart = (function (exports) {
|
|
|
4929
4929
|
</script>
|
|
4930
4930
|
<script>
|
|
4931
4931
|
/*<!--*/
|
|
4932
|
-
const data = {"version":2,"tree":{"name":"root","children":[{"name":"tree-processor.esm.js","children":[{"name":"src/index.ts","uid":"
|
|
4932
|
+
const data = {"version":2,"tree":{"name":"root","children":[{"name":"tree-processor.esm.js","children":[{"name":"src/index.ts","uid":"f5d7d230-1"}]}],"isRoot":true},"nodeParts":{"f5d7d230-1":{"renderedLength":14963,"gzipLength":1892,"brotliLength":1670,"metaUid":"f5d7d230-0"}},"nodeMetas":{"f5d7d230-0":{"id":"\\src\\index.ts","moduleParts":{"tree-processor.esm.js":"f5d7d230-1"},"imported":[],"importedBy":[],"isEntry":true}},"env":{"rollup":"4.56.0"},"options":{"gzip":true,"brotli":true,"sourcemap":false}};
|
|
4933
4933
|
|
|
4934
4934
|
const run = () => {
|
|
4935
4935
|
const width = window.innerWidth;
|
|
@@ -6,65 +6,83 @@ return function r(n){for(const o of n){i.push(e(o))
|
|
|
6
6
|
const n=o[t.children]
|
|
7
7
|
Array.isArray(n)&&n.length>0&&r(n)}}(n),i}function e(n,e,t=r){const i=[]
|
|
8
8
|
return function r(n){n.forEach((n,o)=>{e(n,o)&&i.push(n)
|
|
9
|
-
const
|
|
10
|
-
Array.isArray(
|
|
9
|
+
const u=n[t.children]
|
|
10
|
+
Array.isArray(u)&&u.length>0&&r(u,o)})}(n),i}function t(n,e,i=r){for(const r of n){if(e(r))return r
|
|
11
11
|
const n=r[i.children]
|
|
12
12
|
if(Array.isArray(n)&&n.length>0){const r=t(n,e,i)
|
|
13
13
|
if(r)return r}}return null}function i(n,e,t,i=r){return function r(n){for(const o of n){if(o[i.id]===e)return o[i.children]||(o[i.children]=[]),o[i.children].push(t),!0
|
|
14
14
|
const n=o[i.children]
|
|
15
15
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function o(n,e,t,i=r){return function r(n){for(const o of n){if(o[i.id]===e)return o[i.children]||(o[i.children]=[]),o[i.children].unshift(t),!0
|
|
16
16
|
const n=o[i.children]
|
|
17
|
-
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function s(n,e,t=r){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
18
|
-
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[t.children]
|
|
19
17
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function u(n,e,t=r){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
18
|
+
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[t.children]
|
|
19
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function s(n,e,t=r){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
20
20
|
return!!(Array.isArray(r)&&r.length>0)&&(r.shift(),!0)}const n=i[t.children]
|
|
21
|
-
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function
|
|
21
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function c(n,e,t=r){for(const r of n){if(e(r))return!0
|
|
22
22
|
const n=r[t.children]
|
|
23
|
-
if(Array.isArray(n)&&n.length>0&&
|
|
23
|
+
if(Array.isArray(n)&&n.length>0&&c(n,e,t))return!0}return!1}function f(n,e,t=r){for(const r of n){if(!e(r))return!1
|
|
24
24
|
const n=r[t.children]
|
|
25
|
-
if(Array.isArray(n)&&n.length>0&&!
|
|
25
|
+
if(Array.isArray(n)&&n.length>0&&!f(n,e,t))return!1}return!0}function l(n,e,t,i=r){const o=function r(n){for(const t of n){if(t[i.id]===e)return t
|
|
26
26
|
const n=t[i.children]
|
|
27
27
|
if(Array.isArray(n)&&n.length>0){const e=r(n)
|
|
28
28
|
if(e)return e}}return null}(n)
|
|
29
29
|
if(!o)return null
|
|
30
|
-
const
|
|
31
|
-
if(!Array.isArray(
|
|
32
|
-
const
|
|
33
|
-
return
|
|
34
|
-
if(
|
|
35
|
-
const
|
|
36
|
-
if(Array.isArray(
|
|
37
|
-
if(n)return n}}return null}(n)}function
|
|
30
|
+
const u=o[i.children]
|
|
31
|
+
if(!Array.isArray(u)||0===u.length)return null
|
|
32
|
+
const s=t>=0?t:u.length+t
|
|
33
|
+
return s>=0&&s<u.length?u[s]:null}function a(n,e,t=r){return function r(n,i=[]){for(let o=0;o<n.length;o++){const u=n[o],s=[...i,o]
|
|
34
|
+
if(u[t.id]===e)return s
|
|
35
|
+
const c=u[t.children]
|
|
36
|
+
if(Array.isArray(c)&&c.length>0){const n=r(c,s)
|
|
37
|
+
if(n)return n}}return null}(n)}function h(n,e,t=r){if(!Array.isArray(e)||0===e.length)return null
|
|
38
38
|
let i=n
|
|
39
39
|
for(let r=0;r<e.length;r++){const n=e[r]
|
|
40
40
|
if(!Array.isArray(i)||n<0||n>=i.length)return null
|
|
41
41
|
const o=i[n]
|
|
42
42
|
if(r===e.length-1)return o
|
|
43
|
-
const
|
|
44
|
-
if(!Array.isArray(
|
|
45
|
-
i=
|
|
43
|
+
const u=o[t.children]
|
|
44
|
+
if(!Array.isArray(u))return null
|
|
45
|
+
i=u}return null}function d(n,e=r){const t={}
|
|
46
46
|
return function r(n,i=1){for(const o of n){t[o[e.id]]=i
|
|
47
47
|
const n=o[e.children]
|
|
48
|
-
Array.isArray(n)&&n.length>0&&r(n,i+1)}}(n),t}function y(n,e,t=r){
|
|
48
|
+
Array.isArray(n)&&n.length>0&&r(n,i+1)}}(n),t}function y(n,e,t=r){return function r(n,i=1){for(const o of n){if(o[t.id]===e)return i
|
|
49
|
+
const n=o[t.children]
|
|
50
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n,i+1)
|
|
51
|
+
if(null!==e)return e}}return null}(n)}function A(n,e,t=r){const i=new Set
|
|
49
52
|
return function r(n){const o=[]
|
|
50
|
-
for(const
|
|
53
|
+
for(const u of n){const n=u[e]
|
|
51
54
|
if(null!=n){if(i.has(n))continue
|
|
52
|
-
i.add(n)}const
|
|
53
|
-
Array.isArray(
|
|
55
|
+
i.add(n)}const s={...u},c=u[t.children]
|
|
56
|
+
Array.isArray(c)&&c.length>0&&(s[t.children]=r(c)),o.push(s)}return o}(n)}function p(n,e,t=r){return function r(n){for(let i=0;i<n.length;i++){const o=n[i]
|
|
54
57
|
if(o[t.id]===e)return n.splice(i,1),!0
|
|
55
|
-
const
|
|
56
|
-
if(Array.isArray(
|
|
58
|
+
const u=o[t.children]
|
|
59
|
+
if(Array.isArray(u)&&u.length>0&&r(u))return!0}return!1}(n)}function g(n,e,t=r){!function r(n){for(const i of n){e(i)
|
|
57
60
|
const n=i[t.children]
|
|
58
|
-
Array.isArray(n)&&n.length>0&&r(n)}}(n)}function T(r){return!Array.isArray(r)||0===r.length}function
|
|
61
|
+
Array.isArray(n)&&n.length>0&&r(n)}}(n)}function T(r){return!Array.isArray(r)||0===r.length}function x(n,e=r){if(!E(n,e))return!0
|
|
62
|
+
const t=n[e.children]
|
|
63
|
+
return void 0===t||(!Array.isArray(t)||0===t.length)}function D(n,e,t=r){const i=function r(n){for(const i of n){if(i[t.id]===e)return i
|
|
64
|
+
const n=i[t.children]
|
|
65
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n)
|
|
66
|
+
if(null!==e)return e}}return null}(n)
|
|
67
|
+
if(!i)return[]
|
|
68
|
+
const o=i[t.children]
|
|
69
|
+
return Array.isArray(o)?o:[]}function m(n,e,t=r){const i=function r(n,i=null){for(const o of n){if(o[t.id]===e)return{node:o,parent:i}
|
|
70
|
+
const n=o[t.children]
|
|
71
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n,o)
|
|
72
|
+
if(null!==e)return e}}return null}(n)
|
|
73
|
+
if(!i)return[]
|
|
74
|
+
if(null===i.parent)return n
|
|
75
|
+
const o=i.parent[t.children]
|
|
76
|
+
return Array.isArray(o)?o:[]}function S(n,e,t=r){return function r(n,i=null){for(const o of n){if(o[t.id]===e)return i
|
|
59
77
|
const n=o[t.children]
|
|
60
78
|
if(Array.isArray(n)&&n.length>0){const e=r(n,o)
|
|
61
|
-
if(null!==e)return e}}return null}(n)}function
|
|
79
|
+
if(null!==e)return e}}return null}(n)}function v(n,e,t=r){for(const r of n){if(r[t.id]===e)return!0
|
|
62
80
|
const n=r[t.children]
|
|
63
|
-
if(Array.isArray(n)&&n.length>0&&
|
|
81
|
+
if(Array.isArray(n)&&n.length>0&&v(n,e,t))return!0}return!1}function E(n,e=r){if(!n||"object"!=typeof n||Array.isArray(n))return!1
|
|
64
82
|
const t=n[e.children]
|
|
65
83
|
if(void 0!==t){if(null===t)return!1
|
|
66
84
|
if(!Array.isArray(t))return!1
|
|
67
|
-
for(const r of t)if(!
|
|
68
|
-
for(const r of n)if(!
|
|
69
|
-
return!0}const
|
|
70
|
-
exports.atIndexOfTree=
|
|
85
|
+
for(const r of t)if(!E(r,e))return!1}return!0}function b(n,e=r){if(!Array.isArray(n))return!1
|
|
86
|
+
for(const r of n)if(!E(r,e))return!1
|
|
87
|
+
return!0}const O={mapTree:n,filterTree:e,findTree:t,pushTree:i,unshiftTree:o,popTree:u,shiftTree:s,someTree:c,everyTree:f,atTree:l,indexOfTree:a,atIndexOfTree:h,getNodeDepthMap:d,getNodeDepth:y,dedupTree:A,removeTree:p,forEachTree:g,isEmptyTreeData:T,isEmptySingleTreeData:x,getParentTree:S,getChildrenTree:D,getSiblingsTree:m,includesTree:v,isSingleTreeData:E,isTreeData:b}
|
|
88
|
+
exports.atIndexOfTree=h,exports.atTree=l,exports.dedupTree=A,exports.default=O,exports.everyTree=f,exports.filterTree=e,exports.findTree=t,exports.forEachTree=g,exports.getChildrenTree=D,exports.getNodeDepth=y,exports.getNodeDepthMap=d,exports.getParentTree=S,exports.getSiblingsTree=m,exports.includesTree=v,exports.indexOfTree=a,exports.isEmptySingleTreeData=x,exports.isEmptyTreeData=T,exports.isSingleTreeData=E,exports.isTreeData=b,exports.mapTree=n,exports.popTree=u,exports.pushTree=i,exports.removeTree=p,exports.shiftTree=s,exports.someTree=c,exports.unshiftTree=o
|
|
@@ -4,17 +4,17 @@ return function r(n){for(const o of n){i.push(t(o))
|
|
|
4
4
|
const n=o[e.children]
|
|
5
5
|
Array.isArray(n)&&n.length>0&&r(n)}}(n),i}function t(n,t,e=r){const i=[]
|
|
6
6
|
return function r(n){n.forEach((n,o)=>{t(n,o)&&i.push(n)
|
|
7
|
-
const
|
|
8
|
-
Array.isArray(
|
|
7
|
+
const u=n[e.children]
|
|
8
|
+
Array.isArray(u)&&u.length>0&&r(u,o)})}(n),i}function e(n,t,i=r){for(const r of n){if(t(r))return r
|
|
9
9
|
const n=r[i.children]
|
|
10
10
|
if(Array.isArray(n)&&n.length>0){const r=e(n,t,i)
|
|
11
11
|
if(r)return r}}return null}function i(n,t,e,i=r){return function r(n){for(const o of n){if(o[i.id]===t)return o[i.children]||(o[i.children]=[]),o[i.children].push(e),!0
|
|
12
12
|
const n=o[i.children]
|
|
13
13
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function o(n,t,e,i=r){return function r(n){for(const o of n){if(o[i.id]===t)return o[i.children]||(o[i.children]=[]),o[i.children].unshift(e),!0
|
|
14
14
|
const n=o[i.children]
|
|
15
|
-
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function c(n,t,e=r){return function r(n){for(const i of n){if(i[e.id]===t){const r=i[e.children]
|
|
16
|
-
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[e.children]
|
|
17
15
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function u(n,t,e=r){return function r(n){for(const i of n){if(i[e.id]===t){const r=i[e.children]
|
|
16
|
+
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[e.children]
|
|
17
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function c(n,t,e=r){return function r(n){for(const i of n){if(i[e.id]===t){const r=i[e.children]
|
|
18
18
|
return!!(Array.isArray(r)&&r.length>0)&&(r.shift(),!0)}const n=i[e.children]
|
|
19
19
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function f(n,t,e=r){for(const r of n){if(t(r))return!0
|
|
20
20
|
const n=r[e.children]
|
|
@@ -25,44 +25,62 @@ const n=e[i.children]
|
|
|
25
25
|
if(Array.isArray(n)&&n.length>0){const t=r(n)
|
|
26
26
|
if(t)return t}}return null}(n)
|
|
27
27
|
if(!o)return null
|
|
28
|
-
const
|
|
29
|
-
if(!Array.isArray(
|
|
30
|
-
const
|
|
31
|
-
return
|
|
32
|
-
if(
|
|
33
|
-
const f=
|
|
34
|
-
if(Array.isArray(f)&&f.length>0){const n=r(f,
|
|
35
|
-
if(n)return n}}return null}(n)}function
|
|
28
|
+
const u=o[i.children]
|
|
29
|
+
if(!Array.isArray(u)||0===u.length)return null
|
|
30
|
+
const c=e>=0?e:u.length+e
|
|
31
|
+
return c>=0&&c<u.length?u[c]:null}function a(n,t,e=r){return function r(n,i=[]){for(let o=0;o<n.length;o++){const u=n[o],c=[...i,o]
|
|
32
|
+
if(u[e.id]===t)return c
|
|
33
|
+
const f=u[e.children]
|
|
34
|
+
if(Array.isArray(f)&&f.length>0){const n=r(f,c)
|
|
35
|
+
if(n)return n}}return null}(n)}function h(n,t,e=r){if(!Array.isArray(t)||0===t.length)return null
|
|
36
36
|
let i=n
|
|
37
37
|
for(let r=0;r<t.length;r++){const n=t[r]
|
|
38
38
|
if(!Array.isArray(i)||n<0||n>=i.length)return null
|
|
39
39
|
const o=i[n]
|
|
40
40
|
if(r===t.length-1)return o
|
|
41
|
-
const
|
|
42
|
-
if(!Array.isArray(
|
|
43
|
-
i=
|
|
41
|
+
const u=o[e.children]
|
|
42
|
+
if(!Array.isArray(u))return null
|
|
43
|
+
i=u}return null}function y(n,t=r){const e={}
|
|
44
44
|
return function r(n,i=1){for(const o of n){e[o[t.id]]=i
|
|
45
45
|
const n=o[t.children]
|
|
46
|
-
Array.isArray(n)&&n.length>0&&r(n,i+1)}}(n),e}function d(n,t,e=r){
|
|
46
|
+
Array.isArray(n)&&n.length>0&&r(n,i+1)}}(n),e}function d(n,t,e=r){return function r(n,i=1){for(const o of n){if(o[e.id]===t)return i
|
|
47
|
+
const n=o[e.children]
|
|
48
|
+
if(Array.isArray(n)&&n.length>0){const t=r(n,i+1)
|
|
49
|
+
if(null!==t)return t}}return null}(n)}function A(n,t,e=r){const i=new Set
|
|
47
50
|
return function r(n){const o=[]
|
|
48
|
-
for(const
|
|
51
|
+
for(const u of n){const n=u[t]
|
|
49
52
|
if(null!=n){if(i.has(n))continue
|
|
50
|
-
i.add(n)}const
|
|
51
|
-
Array.isArray(f)&&f.length>0&&(
|
|
53
|
+
i.add(n)}const c={...u},f=u[e.children]
|
|
54
|
+
Array.isArray(f)&&f.length>0&&(c[e.children]=r(f)),o.push(c)}return o}(n)}function g(n,t,e=r){return function r(n){for(let i=0;i<n.length;i++){const o=n[i]
|
|
52
55
|
if(o[e.id]===t)return n.splice(i,1),!0
|
|
53
|
-
const
|
|
54
|
-
if(Array.isArray(
|
|
56
|
+
const u=o[e.children]
|
|
57
|
+
if(Array.isArray(u)&&u.length>0&&r(u))return!0}return!1}(n)}function T(n,t,e=r){!function r(n){for(const i of n){t(i)
|
|
55
58
|
const n=i[e.children]
|
|
56
|
-
Array.isArray(n)&&n.length>0&&r(n)}}(n)}function
|
|
59
|
+
Array.isArray(n)&&n.length>0&&r(n)}}(n)}function p(r){return!Array.isArray(r)||0===r.length}function D(n,t=r){if(!x(n,t))return!0
|
|
60
|
+
const e=n[t.children]
|
|
61
|
+
return void 0===e||(!Array.isArray(e)||0===e.length)}function m(n,t,e=r){const i=function r(n){for(const i of n){if(i[e.id]===t)return i
|
|
62
|
+
const n=i[e.children]
|
|
63
|
+
if(Array.isArray(n)&&n.length>0){const t=r(n)
|
|
64
|
+
if(null!==t)return t}}return null}(n)
|
|
65
|
+
if(!i)return[]
|
|
66
|
+
const o=i[e.children]
|
|
67
|
+
return Array.isArray(o)?o:[]}function v(n,t,e=r){const i=function r(n,i=null){for(const o of n){if(o[e.id]===t)return{node:o,parent:i}
|
|
68
|
+
const n=o[e.children]
|
|
69
|
+
if(Array.isArray(n)&&n.length>0){const t=r(n,o)
|
|
70
|
+
if(null!==t)return t}}return null}(n)
|
|
71
|
+
if(!i)return[]
|
|
72
|
+
if(null===i.parent)return n
|
|
73
|
+
const o=i.parent[e.children]
|
|
74
|
+
return Array.isArray(o)?o:[]}function E(n,t,e=r){return function r(n,i=null){for(const o of n){if(o[e.id]===t)return i
|
|
57
75
|
const n=o[e.children]
|
|
58
76
|
if(Array.isArray(n)&&n.length>0){const t=r(n,o)
|
|
59
|
-
if(null!==t)return t}}return null}(n)}function
|
|
77
|
+
if(null!==t)return t}}return null}(n)}function S(n,t,e=r){for(const r of n){if(r[e.id]===t)return!0
|
|
60
78
|
const n=r[e.children]
|
|
61
|
-
if(Array.isArray(n)&&n.length>0&&
|
|
79
|
+
if(Array.isArray(n)&&n.length>0&&S(n,t,e))return!0}return!1}function x(n,t=r){if(!n||"object"!=typeof n||Array.isArray(n))return!1
|
|
62
80
|
const e=n[t.children]
|
|
63
81
|
if(void 0!==e){if(null===e)return!1
|
|
64
82
|
if(!Array.isArray(e))return!1
|
|
65
|
-
for(const r of e)if(!
|
|
66
|
-
for(const r of n)if(!
|
|
67
|
-
return!0}const
|
|
68
|
-
export{
|
|
83
|
+
for(const r of e)if(!x(r,t))return!1}return!0}function b(n,t=r){if(!Array.isArray(n))return!1
|
|
84
|
+
for(const r of n)if(!x(r,t))return!1
|
|
85
|
+
return!0}const N={mapTree:n,filterTree:t,findTree:e,pushTree:i,unshiftTree:o,popTree:u,shiftTree:c,someTree:f,everyTree:l,atTree:s,indexOfTree:a,atIndexOfTree:h,getNodeDepthMap:y,getNodeDepth:d,dedupTree:A,removeTree:g,forEachTree:T,isEmptyTreeData:p,isEmptySingleTreeData:D,getParentTree:E,getChildrenTree:m,getSiblingsTree:v,includesTree:S,isSingleTreeData:x,isTreeData:b}
|
|
86
|
+
export{h as atIndexOfTree,s as atTree,A as dedupTree,N as default,l as everyTree,t as filterTree,e as findTree,T as forEachTree,m as getChildrenTree,d as getNodeDepth,y as getNodeDepthMap,E as getParentTree,v as getSiblingsTree,S as includesTree,a as indexOfTree,D as isEmptySingleTreeData,p as isEmptyTreeData,x as isSingleTreeData,b as isTreeData,n as mapTree,u as popTree,i as pushTree,g as removeTree,c as shiftTree,f as someTree,o as unshiftTree}
|
|
@@ -5,65 +5,83 @@ return function r(n){for(const o of n){i.push(e(o))
|
|
|
5
5
|
const n=o[t.children]
|
|
6
6
|
Array.isArray(n)&&n.length>0&&r(n)}}(r),i}function t(r,e,t=n){const i=[]
|
|
7
7
|
return function r(n){n.forEach((n,o)=>{e(n,o)&&i.push(n)
|
|
8
|
-
const
|
|
9
|
-
Array.isArray(
|
|
8
|
+
const u=n[t.children]
|
|
9
|
+
Array.isArray(u)&&u.length>0&&r(u,o)})}(r),i}function i(r,e,t=n){for(const n of r){if(e(n))return n
|
|
10
10
|
const r=n[t.children]
|
|
11
11
|
if(Array.isArray(r)&&r.length>0){const n=i(r,e,t)
|
|
12
12
|
if(n)return n}}return null}function o(r,e,t,i=n){return function r(n){for(const o of n){if(o[i.id]===e)return o[i.children]||(o[i.children]=[]),o[i.children].push(t),!0
|
|
13
13
|
const n=o[i.children]
|
|
14
|
-
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function
|
|
14
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function u(r,e,t,i=n){return function r(n){for(const o of n){if(o[i.id]===e)return o[i.children]||(o[i.children]=[]),o[i.children].unshift(t),!0
|
|
15
15
|
const n=o[i.children]
|
|
16
|
-
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function
|
|
16
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function f(r,e,t=n){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
17
17
|
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[t.children]
|
|
18
18
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function c(r,e,t=n){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
19
19
|
return!!(Array.isArray(r)&&r.length>0)&&(r.shift(),!0)}const n=i[t.children]
|
|
20
|
-
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function
|
|
20
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function l(r,e,t=n){for(const n of r){if(e(n))return!0
|
|
21
21
|
const r=n[t.children]
|
|
22
|
-
if(Array.isArray(r)&&r.length>0&&
|
|
22
|
+
if(Array.isArray(r)&&r.length>0&&l(r,e,t))return!0}return!1}function s(r,e,t=n){for(const n of r){if(!e(n))return!1
|
|
23
23
|
const r=n[t.children]
|
|
24
|
-
if(Array.isArray(r)&&r.length>0&&!
|
|
24
|
+
if(Array.isArray(r)&&r.length>0&&!s(r,e,t))return!1}return!0}function a(r,e,t,i=n){const o=function r(n){for(const t of n){if(t[i.id]===e)return t
|
|
25
25
|
const n=t[i.children]
|
|
26
26
|
if(Array.isArray(n)&&n.length>0){const e=r(n)
|
|
27
27
|
if(e)return e}}return null}(r)
|
|
28
28
|
if(!o)return null
|
|
29
|
-
const
|
|
30
|
-
if(!Array.isArray(
|
|
31
|
-
const
|
|
32
|
-
return
|
|
33
|
-
if(
|
|
34
|
-
const c=
|
|
35
|
-
if(Array.isArray(c)&&c.length>0){const n=r(c,
|
|
29
|
+
const u=o[i.children]
|
|
30
|
+
if(!Array.isArray(u)||0===u.length)return null
|
|
31
|
+
const f=t>=0?t:u.length+t
|
|
32
|
+
return f>=0&&f<u.length?u[f]:null}function h(r,e,t=n){return function r(n,i=[]){for(let o=0;o<n.length;o++){const u=n[o],f=[...i,o]
|
|
33
|
+
if(u[t.id]===e)return f
|
|
34
|
+
const c=u[t.children]
|
|
35
|
+
if(Array.isArray(c)&&c.length>0){const n=r(c,f)
|
|
36
36
|
if(n)return n}}return null}(r)}function d(r,e,t=n){if(!Array.isArray(e)||0===e.length)return null
|
|
37
37
|
let i=r
|
|
38
38
|
for(let r=0;r<e.length;r++){const n=e[r]
|
|
39
39
|
if(!Array.isArray(i)||n<0||n>=i.length)return null
|
|
40
40
|
const o=i[n]
|
|
41
41
|
if(r===e.length-1)return o
|
|
42
|
-
const
|
|
43
|
-
if(!Array.isArray(
|
|
44
|
-
i=
|
|
42
|
+
const u=o[t.children]
|
|
43
|
+
if(!Array.isArray(u))return null
|
|
44
|
+
i=u}return null}function y(r,e=n){const t={}
|
|
45
45
|
return function r(n,i=1){for(const o of n){t[o[e.id]]=i
|
|
46
46
|
const n=o[e.children]
|
|
47
|
-
Array.isArray(n)&&n.length>0&&r(n,i+1)}}(r),t}function A(r,e,t=n){
|
|
47
|
+
Array.isArray(n)&&n.length>0&&r(n,i+1)}}(r),t}function A(r,e,t=n){return function r(n,i=1){for(const o of n){if(o[t.id]===e)return i
|
|
48
|
+
const n=o[t.children]
|
|
49
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n,i+1)
|
|
50
|
+
if(null!==e)return e}}return null}(r)}function g(r,e,t=n){const i=new Set
|
|
48
51
|
return function r(n){const o=[]
|
|
49
|
-
for(const
|
|
52
|
+
for(const u of n){const n=u[e]
|
|
50
53
|
if(null!=n){if(i.has(n))continue
|
|
51
|
-
i.add(n)}const
|
|
52
|
-
Array.isArray(c)&&c.length>0&&(
|
|
54
|
+
i.add(n)}const f={...u},c=u[t.children]
|
|
55
|
+
Array.isArray(c)&&c.length>0&&(f[t.children]=r(c)),o.push(f)}return o}(r)}function T(r,e,t=n){return function r(n){for(let i=0;i<n.length;i++){const o=n[i]
|
|
53
56
|
if(o[t.id]===e)return n.splice(i,1),!0
|
|
54
|
-
const
|
|
55
|
-
if(Array.isArray(
|
|
57
|
+
const u=o[t.children]
|
|
58
|
+
if(Array.isArray(u)&&u.length>0&&r(u))return!0}return!1}(r)}function p(r,e,t=n){!function r(n){for(const i of n){e(i)
|
|
59
|
+
const n=i[t.children]
|
|
60
|
+
Array.isArray(n)&&n.length>0&&r(n)}}(r)}function m(r){return!Array.isArray(r)||0===r.length}function D(r,e=n){if(!E(r,e))return!0
|
|
61
|
+
const t=r[e.children]
|
|
62
|
+
return void 0===t||(!Array.isArray(t)||0===t.length)}function S(r,e,t=n){const i=function r(n){for(const i of n){if(i[t.id]===e)return i
|
|
56
63
|
const n=i[t.children]
|
|
57
|
-
Array.isArray(n)&&n.length>0
|
|
64
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n)
|
|
65
|
+
if(null!==e)return e}}return null}(r)
|
|
66
|
+
if(!i)return[]
|
|
67
|
+
const o=i[t.children]
|
|
68
|
+
return Array.isArray(o)?o:[]}function b(r,e,t=n){const i=function r(n,i=null){for(const o of n){if(o[t.id]===e)return{node:o,parent:i}
|
|
69
|
+
const n=o[t.children]
|
|
70
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n,o)
|
|
71
|
+
if(null!==e)return e}}return null}(r)
|
|
72
|
+
if(!i)return[]
|
|
73
|
+
if(null===i.parent)return r
|
|
74
|
+
const o=i.parent[t.children]
|
|
75
|
+
return Array.isArray(o)?o:[]}function v(r,e,t=n){return function r(n,i=null){for(const o of n){if(o[t.id]===e)return i
|
|
58
76
|
const n=o[t.children]
|
|
59
77
|
if(Array.isArray(n)&&n.length>0){const e=r(n,o)
|
|
60
|
-
if(null!==e)return e}}return null}(r)}function
|
|
78
|
+
if(null!==e)return e}}return null}(r)}function x(r,e,t=n){for(const n of r){if(n[t.id]===e)return!0
|
|
61
79
|
const r=n[t.children]
|
|
62
|
-
if(Array.isArray(r)&&r.length>0&&
|
|
80
|
+
if(Array.isArray(r)&&r.length>0&&x(r,e,t))return!0}return!1}function E(r,e=n){if(!r||"object"!=typeof r||Array.isArray(r))return!1
|
|
63
81
|
const t=r[e.children]
|
|
64
82
|
if(void 0!==t){if(null===t)return!1
|
|
65
83
|
if(!Array.isArray(t))return!1
|
|
66
|
-
for(const r of t)if(!
|
|
67
|
-
for(const n of r)if(!
|
|
68
|
-
return!0}const M={mapTree:e,filterTree:t,findTree:i,pushTree:o,unshiftTree:
|
|
69
|
-
r.atIndexOfTree=d,r.atTree=
|
|
84
|
+
for(const r of t)if(!E(r,e))return!1}return!0}function O(r,e=n){if(!Array.isArray(r))return!1
|
|
85
|
+
for(const n of r)if(!E(n,e))return!1
|
|
86
|
+
return!0}const M={mapTree:e,filterTree:t,findTree:i,pushTree:o,unshiftTree:u,popTree:f,shiftTree:c,someTree:l,everyTree:s,atTree:a,indexOfTree:h,atIndexOfTree:d,getNodeDepthMap:y,getNodeDepth:A,dedupTree:g,removeTree:T,forEachTree:p,isEmptyTreeData:m,isEmptySingleTreeData:D,getParentTree:v,getChildrenTree:S,getSiblingsTree:b,includesTree:x,isSingleTreeData:E,isTreeData:O}
|
|
87
|
+
r.atIndexOfTree=d,r.atTree=a,r.dedupTree=g,r.default=M,r.everyTree=s,r.filterTree=t,r.findTree=i,r.forEachTree=p,r.getChildrenTree=S,r.getNodeDepth=A,r.getNodeDepthMap=y,r.getParentTree=v,r.getSiblingsTree=b,r.includesTree=x,r.indexOfTree=h,r.isEmptySingleTreeData=D,r.isEmptyTreeData=m,r.isSingleTreeData=E,r.isTreeData=O,r.mapTree=e,r.popTree=f,r.pushTree=o,r.removeTree=T,r.shiftTree=c,r.someTree=l,r.unshiftTree=u,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})})
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tree-processor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "A lightweight TypeScript library for processing tree-structured data with comprehensive methods (map, filter, find, push, pop, remove, getParent, includes, etc.), supporting tree-shaking and custom field names",
|
|
5
5
|
"main": "dist/tree-processor.cjs.js",
|
|
6
6
|
"module": "dist/tree-processor.esm.js",
|