tree-processor 0.3.0 → 0.4.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 +55 -21
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/stats.html +1 -1
- package/dist/tree-processor.cjs.js +21 -11
- package/dist/tree-processor.esm.js +12 -2
- package/dist/tree-processor.umd.js +20 -10
- package/package.json +2 -2
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、filterTree、findTree、pushTree、unshiftTree、popTree、shiftTree、someTree、everyTree、atTree、indexOfTree、atIndexOfTree、nodeDepthMap 和
|
|
5
|
+
目前已支持 mapTree、forEachTree、filterTree、findTree、pushTree、unshiftTree、popTree、shiftTree、someTree、everyTree、includesTree、atTree、indexOfTree、atIndexOfTree、getParentTree、nodeDepthMap、dedupTree、removeTree 和 isEmptyTree。每个方法的最后一个参数可以自定义 children 和 id 的属性名。
|
|
6
6
|
|
|
7
7
|
## ✨ 特性
|
|
8
8
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- 🎯 **类似数组 API** - 提供 map、filter、find 等熟悉的数组方法
|
|
13
13
|
- ⚙️ **自定义字段名** - 支持自定义 children 和 id 字段名
|
|
14
14
|
- ✅ **零依赖** - 无外部依赖,开箱即用
|
|
15
|
+
- 🧪 **完善的测试覆盖** - 包含 103 个测试用例,覆盖基础功能、边界情况、异常处理、复杂场景等
|
|
15
16
|
|
|
16
17
|
## 📦 安装
|
|
17
18
|
|
|
@@ -91,6 +92,18 @@ t.mapTree(treeData, (item) => {
|
|
|
91
92
|
})
|
|
92
93
|
```
|
|
93
94
|
|
|
95
|
+
### forEachTree(遍历树结构数据的方法,不返回值)
|
|
96
|
+
|
|
97
|
+
遍历树结构数据,对每个节点执行回调函数。与 mapTree 的区别是不返回值,性能更好,适合只需要遍历而不需要返回结果的场景。
|
|
98
|
+
|
|
99
|
+
```javascript
|
|
100
|
+
t.forEachTree(treeData, (item) => {
|
|
101
|
+
console.log(item)
|
|
102
|
+
// 可以在这里修改节点
|
|
103
|
+
item.visited = true
|
|
104
|
+
})
|
|
105
|
+
```
|
|
106
|
+
|
|
94
107
|
### filterTree(树结构数据的filter方法)
|
|
95
108
|
|
|
96
109
|
过滤树结构数据,返回满足条件的节点。
|
|
@@ -176,6 +189,16 @@ const result = t.everyTree(treeData, item => item.age >= 18)
|
|
|
176
189
|
console.log(result)
|
|
177
190
|
```
|
|
178
191
|
|
|
192
|
+
### includesTree(检查树中是否包含指定节点)
|
|
193
|
+
|
|
194
|
+
检查树结构数据中是否包含指定ID的节点。
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
const hasNode = t.includesTree(treeData, targetId)
|
|
198
|
+
|
|
199
|
+
console.log(hasNode) // true 表示包含该节点,false 表示不包含
|
|
200
|
+
```
|
|
201
|
+
|
|
179
202
|
### atTree(根据父节点ID和子节点索引获取节点)
|
|
180
203
|
|
|
181
204
|
parentId 为指定父节点的 id,nodeIndex 为子节点的索引,可传负数,和数组的 at 方法一样。
|
|
@@ -206,6 +229,16 @@ const result = t.atIndexOfTree(treeData, [0, 1, 0])
|
|
|
206
229
|
console.log(result)
|
|
207
230
|
```
|
|
208
231
|
|
|
232
|
+
### getParentTree(获取节点的父节点)
|
|
233
|
+
|
|
234
|
+
获取指定节点的父节点。如果节点是根节点,返回 null。
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
const parent = t.getParentTree(treeData, targetId)
|
|
238
|
+
|
|
239
|
+
console.log(parent) // 返回父节点对象,如果未找到或节点是根节点则返回 null
|
|
240
|
+
```
|
|
241
|
+
|
|
209
242
|
### nodeDepthMap(返回节点ID到深度的映射)
|
|
210
243
|
|
|
211
244
|
返回一个字典,键代表节点的 id,值代表该节点在数据的第几层。
|
|
@@ -226,6 +259,27 @@ const result = t.dedupTree(treeData, 'id')
|
|
|
226
259
|
console.log(result)
|
|
227
260
|
```
|
|
228
261
|
|
|
262
|
+
### removeTree(删除指定节点)
|
|
263
|
+
|
|
264
|
+
删除树结构数据中指定ID的节点,包括根节点和子节点。
|
|
265
|
+
|
|
266
|
+
```javascript
|
|
267
|
+
const success = t.removeTree(treeData, targetId)
|
|
268
|
+
|
|
269
|
+
console.log(success) // true 表示删除成功,false 表示未找到节点
|
|
270
|
+
console.log(treeData) // 删除后的树结构
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### isEmptyTree(检查树是否为空)
|
|
274
|
+
|
|
275
|
+
检查树结构数据是否为空。
|
|
276
|
+
|
|
277
|
+
```javascript
|
|
278
|
+
const isEmpty = t.isEmptyTree(treeData)
|
|
279
|
+
|
|
280
|
+
console.log(isEmpty) // true 表示树为空,false 表示树不为空
|
|
281
|
+
```
|
|
282
|
+
|
|
229
283
|
## 自定义字段名
|
|
230
284
|
|
|
231
285
|
所有方法都支持自定义 children 和 id 的属性名,通过最后一个参数传入配置对象:
|
|
@@ -237,19 +291,6 @@ const result = t.findTree(treeData, (item) => item.nodeId === 2, fieldNames);
|
|
|
237
291
|
|
|
238
292
|
## 测试
|
|
239
293
|
|
|
240
|
-
项目包含 **73 个测试用例**,覆盖了各种场景和边界情况:
|
|
241
|
-
|
|
242
|
-
### 测试覆盖范围
|
|
243
|
-
|
|
244
|
-
- ✅ **基础功能测试** - 所有 13 个核心方法的正常使用场景
|
|
245
|
-
- ✅ **边界情况测试** - 空数据、单节点、深层嵌套等
|
|
246
|
-
- ✅ **异常处理测试** - children 字段为 null/undefined/非数组等情况
|
|
247
|
-
- ✅ **索引边界测试** - 负数索引、超出范围、空路径等
|
|
248
|
-
- ✅ **复杂场景测试** - 多根节点、数据修改、组合操作等
|
|
249
|
-
- ✅ **自定义字段名测试** - 各种自定义字段名的使用场景
|
|
250
|
-
- ✅ **特殊值处理测试** - id 为 0、false、字符串等特殊情况
|
|
251
|
-
- ✅ **去重功能测试** - 嵌套重复、null/undefined 值去重等
|
|
252
|
-
|
|
253
294
|
### 运行测试
|
|
254
295
|
|
|
255
296
|
```bash
|
|
@@ -263,13 +304,6 @@ npm run test:coverage
|
|
|
263
304
|
npm test -- --run
|
|
264
305
|
```
|
|
265
306
|
|
|
266
|
-
### 测试统计
|
|
267
|
-
|
|
268
|
-
- **测试文件**: 2 个(功能测试 + 导入测试)
|
|
269
|
-
- **测试用例**: 73 个
|
|
270
|
-
- **测试框架**: Vitest
|
|
271
|
-
- **覆盖率**: 包含边界情况和复杂场景的全面测试
|
|
272
|
-
|
|
273
307
|
## 开发
|
|
274
308
|
|
|
275
309
|
```bash
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,11 @@ export declare function indexOfTree(tree: TreeData, targetId: any, fieldNames?:
|
|
|
18
18
|
export declare function atIndexOfTree(tree: TreeData, path: number[], fieldNames?: FieldNames): TreeNode | null;
|
|
19
19
|
export declare function nodeDepthMap(tree: TreeData, fieldNames?: FieldNames): Record<string, number>;
|
|
20
20
|
export declare function dedupTree(tree: TreeData, key: string, fieldNames?: FieldNames): TreeData;
|
|
21
|
+
export declare function removeTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): boolean;
|
|
22
|
+
export declare function forEachTree(tree: TreeData, callback: (node: TreeNode) => void, fieldNames?: FieldNames): void;
|
|
23
|
+
export declare function isEmptyTree(tree: TreeData): boolean;
|
|
24
|
+
export declare function getParentTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): TreeNode | null;
|
|
25
|
+
export declare function includesTree(tree: TreeData, targetId: any, fieldNames?: FieldNames): boolean;
|
|
21
26
|
declare const treeProcessor: {
|
|
22
27
|
mapTree: typeof mapTree;
|
|
23
28
|
filterTree: typeof filterTree;
|
|
@@ -33,6 +38,11 @@ declare const treeProcessor: {
|
|
|
33
38
|
atIndexOfTree: typeof atIndexOfTree;
|
|
34
39
|
nodeDepthMap: typeof nodeDepthMap;
|
|
35
40
|
dedupTree: typeof dedupTree;
|
|
41
|
+
removeTree: typeof removeTree;
|
|
42
|
+
forEachTree: typeof forEachTree;
|
|
43
|
+
isEmptyTree: typeof isEmptyTree;
|
|
44
|
+
getParentTree: typeof getParentTree;
|
|
45
|
+
includesTree: typeof includesTree;
|
|
36
46
|
};
|
|
37
47
|
export default treeProcessor;
|
|
38
48
|
//# 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,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,UAAU,GAAE,UAAgC,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAexB;AASD,wBAAgB,SAAS,CACvB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,UAAgC,GAC3C,QAAQ,CA+BV;AAKD,QAAA,MAAM,aAAa
|
|
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,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,UAAU,GAAE,UAAgC,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAexB;AASD,wBAAgB,SAAS,CACvB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,UAAgC,GAC3C,QAAQ,CA+BV;AASD,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,EACb,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAuBT;AAQD,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,EAClC,UAAU,GAAE,UAAgC,GAC3C,IAAI,CAYN;AAOD,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,GACb,OAAO,CAET;AASD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,EACb,UAAU,GAAE,UAAgC,GAC3C,QAAQ,GAAG,IAAI,CAqBjB;AASD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,GAAG,EACb,UAAU,GAAE,UAAgC,GAC3C,OAAO,CAaT;AAKD,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;CAoBlB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
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.umd.js","children":[{"name":"src/index.ts","uid":"
|
|
4932
|
+
const data = {"version":2,"tree":{"name":"root","children":[{"name":"tree-processor.umd.js","children":[{"name":"src/index.ts","uid":"07707b15-1"}]}],"isRoot":true},"nodeParts":{"07707b15-1":{"renderedLength":11403,"gzipLength":1547,"brotliLength":1351,"metaUid":"07707b15-0"}},"nodeMetas":{"07707b15-0":{"id":"\\src\\index.ts","moduleParts":{"tree-processor.umd.js":"07707b15-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;
|
|
@@ -16,11 +16,11 @@ if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function o(n,e,t,i=r
|
|
|
16
16
|
const n=o[i.children]
|
|
17
17
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(n)}function c(n,e,t=r){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
18
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
|
|
19
|
+
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]
|
|
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 s(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&&s(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
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]
|
|
@@ -29,11 +29,11 @@ if(e)return e}}return null}(n)
|
|
|
29
29
|
if(!o)return null
|
|
30
30
|
const c=o[i.children]
|
|
31
31
|
if(!Array.isArray(c)||0===c.length)return null
|
|
32
|
-
const
|
|
33
|
-
return
|
|
34
|
-
if(c[t.id]===e)return
|
|
35
|
-
const
|
|
36
|
-
if(Array.isArray(
|
|
32
|
+
const u=t>=0?t:c.length+t
|
|
33
|
+
return u>=0&&u<c.length?c[u]:null}function h(n,e,t=r){return function r(n,i=[]){for(let o=0;o<n.length;o++){const c=n[o],u=[...i,o]
|
|
34
|
+
if(c[t.id]===e)return u
|
|
35
|
+
const s=c[t.children]
|
|
36
|
+
if(Array.isArray(s)&&s.length>0){const n=r(s,u)
|
|
37
37
|
if(n)return n}}return null}(n)}function a(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]
|
|
@@ -49,6 +49,16 @@ Array.isArray(n)&&n.length>0&&r(n,i+1)}}(n),t}function y(n,e,t=r){const i=new Se
|
|
|
49
49
|
return function r(n){const o=[]
|
|
50
50
|
for(const c of n){const n=c[e]
|
|
51
51
|
if(null!=n){if(i.has(n))continue
|
|
52
|
-
i.add(n)}const
|
|
53
|
-
Array.isArray(
|
|
54
|
-
|
|
52
|
+
i.add(n)}const u={...c},s=c[t.children]
|
|
53
|
+
Array.isArray(s)&&s.length>0&&(u[t.children]=r(s)),o.push(u)}return o}(n)}function A(n,e,t=r){return function r(n){for(let i=0;i<n.length;i++){const o=n[i]
|
|
54
|
+
if(o[t.id]===e)return n.splice(i,1),!0
|
|
55
|
+
const c=o[t.children]
|
|
56
|
+
if(Array.isArray(c)&&c.length>0&&r(c))return!0}return!1}(n)}function p(n,e,t=r){!function r(n){for(const i of n){e(i)
|
|
57
|
+
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 g(n,e,t=r){return function r(n,i=null){for(const o of n){if(o[t.id]===e)return i
|
|
59
|
+
const n=o[t.children]
|
|
60
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n,o)
|
|
61
|
+
if(null!==e)return e}}return null}(n)}function x(n,e,t=r){for(const r of n){if(r[t.id]===e)return!0
|
|
62
|
+
const n=r[t.children]
|
|
63
|
+
if(Array.isArray(n)&&n.length>0&&x(n,e,t))return!0}return!1}const m={mapTree:n,filterTree:e,findTree:t,pushTree:i,unshiftTree:o,popTree:c,shiftTree:u,someTree:s,everyTree:f,atTree:l,indexOfTree:h,atIndexOfTree:a,nodeDepthMap:d,dedupTree:y,removeTree:A,forEachTree:p,isEmptyTree:T,getParentTree:g,includesTree:x}
|
|
64
|
+
exports.atIndexOfTree=a,exports.atTree=l,exports.dedupTree=y,exports.default=m,exports.everyTree=f,exports.filterTree=e,exports.findTree=t,exports.forEachTree=p,exports.getParentTree=g,exports.includesTree=x,exports.indexOfTree=h,exports.isEmptyTree=T,exports.mapTree=n,exports.nodeDepthMap=d,exports.popTree=c,exports.pushTree=i,exports.removeTree=A,exports.shiftTree=u,exports.someTree=s,exports.unshiftTree=o
|
|
@@ -48,5 +48,15 @@ return function r(n){const o=[]
|
|
|
48
48
|
for(const c of n){const n=c[t]
|
|
49
49
|
if(null!=n){if(i.has(n))continue
|
|
50
50
|
i.add(n)}const u={...c},f=c[e.children]
|
|
51
|
-
Array.isArray(f)&&f.length>0&&(u[e.children]=r(f)),o.push(u)}return o}(n)}
|
|
52
|
-
|
|
51
|
+
Array.isArray(f)&&f.length>0&&(u[e.children]=r(f)),o.push(u)}return o}(n)}function A(n,t,e=r){return function r(n){for(let i=0;i<n.length;i++){const o=n[i]
|
|
52
|
+
if(o[e.id]===t)return n.splice(i,1),!0
|
|
53
|
+
const c=o[e.children]
|
|
54
|
+
if(Array.isArray(c)&&c.length>0&&r(c))return!0}return!1}(n)}function g(n,t,e=r){!function r(n){for(const i of n){t(i)
|
|
55
|
+
const n=i[e.children]
|
|
56
|
+
Array.isArray(n)&&n.length>0&&r(n)}}(n)}function T(r){return!Array.isArray(r)||0===r.length}function p(n,t,e=r){return function r(n,i=null){for(const o of n){if(o[e.id]===t)return i
|
|
57
|
+
const n=o[e.children]
|
|
58
|
+
if(Array.isArray(n)&&n.length>0){const t=r(n,o)
|
|
59
|
+
if(null!==t)return t}}return null}(n)}function m(n,t,e=r){for(const r of n){if(r[e.id]===t)return!0
|
|
60
|
+
const n=r[e.children]
|
|
61
|
+
if(Array.isArray(n)&&n.length>0&&m(n,t,e))return!0}return!1}const x={mapTree:n,filterTree:t,findTree:e,pushTree:i,unshiftTree:o,popTree:c,shiftTree:u,someTree:f,everyTree:l,atTree:s,indexOfTree:h,atIndexOfTree:a,nodeDepthMap:d,dedupTree:y,removeTree:A,forEachTree:g,isEmptyTree:T,getParentTree:p,includesTree:m}
|
|
62
|
+
export{a as atIndexOfTree,s as atTree,y as dedupTree,x as default,l as everyTree,t as filterTree,e as findTree,g as forEachTree,p as getParentTree,m as includesTree,h as indexOfTree,T as isEmptyTree,n as mapTree,d as nodeDepthMap,c as popTree,i as pushTree,A as removeTree,u as shiftTree,f as someTree,o as unshiftTree}
|
|
@@ -13,9 +13,9 @@ if(n)return n}}return null}function o(r,e,t,i=n){return function r(n){for(const
|
|
|
13
13
|
const n=o[i.children]
|
|
14
14
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function f(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 u(r,e,t=n){return function r(n){for(const i of n){if(i[t.id]===e){const r=i[t.children]
|
|
17
|
-
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[t.children]
|
|
18
16
|
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]
|
|
17
|
+
return!!(Array.isArray(r)&&r.length>0)&&(r.pop(),!0)}const n=i[t.children]
|
|
18
|
+
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function u(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
20
|
if(Array.isArray(n)&&n.length>0&&r(n))return!0}return!1}(r)}function s(r,e,t=n){for(const n of r){if(e(n))return!0
|
|
21
21
|
const r=n[t.children]
|
|
@@ -28,11 +28,11 @@ if(e)return e}}return null}(r)
|
|
|
28
28
|
if(!o)return null
|
|
29
29
|
const f=o[i.children]
|
|
30
30
|
if(!Array.isArray(f)||0===f.length)return null
|
|
31
|
-
const
|
|
32
|
-
return
|
|
33
|
-
if(f[t.id]===e)return
|
|
34
|
-
const
|
|
35
|
-
if(Array.isArray(
|
|
31
|
+
const c=t>=0?t:f.length+t
|
|
32
|
+
return c>=0&&c<f.length?f[c]:null}function d(r,e,t=n){return function r(n,i=[]){for(let o=0;o<n.length;o++){const f=n[o],c=[...i,o]
|
|
33
|
+
if(f[t.id]===e)return c
|
|
34
|
+
const u=f[t.children]
|
|
35
|
+
if(Array.isArray(u)&&u.length>0){const n=r(u,c)
|
|
36
36
|
if(n)return n}}return null}(r)}function a(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]
|
|
@@ -48,6 +48,16 @@ Array.isArray(n)&&n.length>0&&r(n,i+1)}}(r),t}function A(r,e,t=n){const i=new Se
|
|
|
48
48
|
return function r(n){const o=[]
|
|
49
49
|
for(const f of n){const n=f[e]
|
|
50
50
|
if(null!=n){if(i.has(n))continue
|
|
51
|
-
i.add(n)}const
|
|
52
|
-
Array.isArray(
|
|
53
|
-
|
|
51
|
+
i.add(n)}const c={...f},u=f[t.children]
|
|
52
|
+
Array.isArray(u)&&u.length>0&&(c[t.children]=r(u)),o.push(c)}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
|
+
if(o[t.id]===e)return n.splice(i,1),!0
|
|
54
|
+
const f=o[t.children]
|
|
55
|
+
if(Array.isArray(f)&&f.length>0&&r(f))return!0}return!1}(r)}function g(r,e,t=n){!function r(n){for(const i of n){e(i)
|
|
56
|
+
const n=i[t.children]
|
|
57
|
+
Array.isArray(n)&&n.length>0&&r(n)}}(r)}function p(r){return!Array.isArray(r)||0===r.length}function m(r,e,t=n){return function r(n,i=null){for(const o of n){if(o[t.id]===e)return i
|
|
58
|
+
const n=o[t.children]
|
|
59
|
+
if(Array.isArray(n)&&n.length>0){const e=r(n,o)
|
|
60
|
+
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
|
+
const r=n[t.children]
|
|
62
|
+
if(Array.isArray(r)&&r.length>0&&x(r,e,t))return!0}return!1}const v={mapTree:e,filterTree:t,findTree:i,pushTree:o,unshiftTree:f,popTree:c,shiftTree:u,someTree:s,everyTree:l,atTree:h,indexOfTree:d,atIndexOfTree:a,nodeDepthMap:y,dedupTree:A,removeTree:T,forEachTree:g,isEmptyTree:p,getParentTree:m,includesTree:x}
|
|
63
|
+
r.atIndexOfTree=a,r.atTree=h,r.dedupTree=A,r.default=v,r.everyTree=l,r.filterTree=t,r.findTree=i,r.forEachTree=g,r.getParentTree=m,r.includesTree=x,r.indexOfTree=d,r.isEmptyTree=p,r.mapTree=e,r.nodeDepthMap=y,r.popTree=c,r.pushTree=o,r.removeTree=T,r.shiftTree=u,r.someTree=s,r.unshiftTree=f,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})})
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tree-processor",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A lightweight TypeScript library for processing tree-structured data with
|
|
3
|
+
"version": "0.4.0",
|
|
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",
|
|
7
7
|
"types": "dist/index.d.ts",
|