@kcuf/helper-tree 0.1.3 → 0.2.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/CHANGELOG.md +5 -1
- package/README.md +3 -0
- package/dist/cjs/helper/index.js +7 -0
- package/dist/cjs/helper/tree-build.js +3 -1
- package/dist/cjs/helper/tree-trim.js +32 -0
- package/dist/esm/helper/index.js +1 -0
- package/dist/esm/helper/index.js.map +1 -1
- package/dist/esm/helper/tree-build.js +3 -1
- package/dist/esm/helper/tree-build.js.map +1 -1
- package/dist/esm/helper/tree-trim.js +27 -0
- package/dist/esm/helper/tree-trim.js.map +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/helper/index.d.ts +1 -0
- package/dist/types/helper/tree-build.d.ts +1 -1
- package/dist/types/helper/tree-trim.d.ts +5 -0
- package/dist/types/types/index.d.ts +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
package/dist/cjs/helper/index.js
CHANGED
|
@@ -40,9 +40,16 @@ Object.defineProperty(exports, "treeTraverse", {
|
|
|
40
40
|
return _treeTraverse.default;
|
|
41
41
|
}
|
|
42
42
|
});
|
|
43
|
+
Object.defineProperty(exports, "treeTrim", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function get() {
|
|
46
|
+
return _treeTrim.default;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
43
49
|
var _treeBuild = _interopRequireDefault(require("./tree-build"));
|
|
44
50
|
var _treeFlatten = _interopRequireDefault(require("./tree-flatten"));
|
|
45
51
|
var _treeTraverse = _interopRequireDefault(require("./tree-traverse"));
|
|
46
52
|
var _treeFilter = _interopRequireDefault(require("./tree-filter"));
|
|
53
|
+
var _treeTrim = _interopRequireDefault(require("./tree-trim"));
|
|
47
54
|
var _treeMap = _interopRequireDefault(require("./tree-map"));
|
|
48
55
|
var _treeDisable = _interopRequireDefault(require("./tree-disable"));
|
|
@@ -7,10 +7,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.default = treeBuild;
|
|
8
8
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
9
|
var _treeFlatten = _interopRequireDefault(require("./tree-flatten"));
|
|
10
|
+
var _treeTrim = _interopRequireDefault(require("./tree-trim"));
|
|
10
11
|
/**
|
|
11
12
|
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
12
13
|
*/
|
|
13
14
|
function treeBuild(list) {
|
|
15
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
14
16
|
var nodeMap = new Map();
|
|
15
17
|
var listClone = list.map(function (v) {
|
|
16
18
|
var treeItem = (0, _objectSpread2.default)({}, v);
|
|
@@ -48,5 +50,5 @@ function treeBuild(list) {
|
|
|
48
50
|
}
|
|
49
51
|
});
|
|
50
52
|
}
|
|
51
|
-
return tree;
|
|
53
|
+
return depth > 0 ? (0, _treeTrim.default)(tree, depth) : tree;
|
|
52
54
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = treeTrim;
|
|
7
|
+
function treeTrimRecursive(tree, maxDepth, currentDepth) {
|
|
8
|
+
if (currentDepth >= maxDepth) {
|
|
9
|
+
tree.forEach(function (node) {
|
|
10
|
+
node.children = null;
|
|
11
|
+
delete node.children;
|
|
12
|
+
});
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
tree.forEach(function (node) {
|
|
16
|
+
var _node$children;
|
|
17
|
+
if ((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length) {
|
|
18
|
+
treeTrimRecursive(node.children, maxDepth, currentDepth + 1);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 修建树到最大深度(注意,此方法会直接修改原树)
|
|
25
|
+
*/
|
|
26
|
+
function treeTrim(tree, maxDepth) {
|
|
27
|
+
if (maxDepth < 1) {
|
|
28
|
+
return tree;
|
|
29
|
+
}
|
|
30
|
+
treeTrimRecursive(tree, maxDepth, 0);
|
|
31
|
+
return tree;
|
|
32
|
+
}
|
package/dist/esm/helper/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export { default as treeBuild } from './tree-build';
|
|
|
2
2
|
export { default as treeFlatten } from './tree-flatten';
|
|
3
3
|
export { default as treeTraverse } from './tree-traverse';
|
|
4
4
|
export { default as treeFilter } from './tree-filter';
|
|
5
|
+
export { default as treeTrim } from './tree-trim';
|
|
5
6
|
export { default as treeMap } from './tree-map';
|
|
6
7
|
export { default as treeDisable } from './tree-disable';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["default","treeBuild","treeFlatten","treeTraverse","treeFilter","treeMap","treeDisable"],"sources":["../../../src/helper/index.ts"],"sourcesContent":["export { default as treeBuild } from './tree-build';\nexport { default as treeFlatten } from './tree-flatten';\nexport { default as treeTraverse } from './tree-traverse';\nexport { default as treeFilter } from './tree-filter';\nexport { default as treeMap } from './tree-map';\nexport { default as treeDisable } from './tree-disable';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,SAAS,QAAQ,cAAc;AACnD,SAASD,OAAO,IAAIE,WAAW,QAAQ,gBAAgB;AACvD,SAASF,OAAO,IAAIG,YAAY,QAAQ,iBAAiB;AACzD,SAASH,OAAO,IAAII,UAAU,QAAQ,eAAe;AACrD,SAASJ,OAAO,IAAIK,OAAO,QAAQ,YAAY;AAC/C,
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","treeBuild","treeFlatten","treeTraverse","treeFilter","treeTrim","treeMap","treeDisable"],"sources":["../../../src/helper/index.ts"],"sourcesContent":["export { default as treeBuild } from './tree-build';\nexport { default as treeFlatten } from './tree-flatten';\nexport { default as treeTraverse } from './tree-traverse';\nexport { default as treeFilter } from './tree-filter';\nexport { default as treeTrim } from './tree-trim';\nexport { default as treeMap } from './tree-map';\nexport { default as treeDisable } from './tree-disable';\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,SAAS,QAAQ,cAAc;AACnD,SAASD,OAAO,IAAIE,WAAW,QAAQ,gBAAgB;AACvD,SAASF,OAAO,IAAIG,YAAY,QAAQ,iBAAiB;AACzD,SAASH,OAAO,IAAII,UAAU,QAAQ,eAAe;AACrD,SAASJ,OAAO,IAAIK,QAAQ,QAAQ,aAAa;AACjD,SAASL,OAAO,IAAIM,OAAO,QAAQ,YAAY;AAC/C,SAASN,OAAO,IAAIO,WAAW,QAAQ,gBAAgB","ignoreList":[]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
|
|
2
2
|
import treeFlatten from './tree-flatten';
|
|
3
|
+
import treeTrim from './tree-trim';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
6
7
|
*/
|
|
7
8
|
export default function treeBuild(list) {
|
|
9
|
+
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
8
10
|
var nodeMap = new Map();
|
|
9
11
|
var listClone = list.map(function (v) {
|
|
10
12
|
var treeItem = _objectSpread({}, v);
|
|
@@ -42,6 +44,6 @@ export default function treeBuild(list) {
|
|
|
42
44
|
}
|
|
43
45
|
});
|
|
44
46
|
}
|
|
45
|
-
return tree;
|
|
47
|
+
return depth > 0 ? treeTrim(tree, depth) : tree;
|
|
46
48
|
}
|
|
47
49
|
//# sourceMappingURL=tree-build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-build.js","names":["treeFlatten","treeBuild","list","nodeMap","Map","listClone","map","v","treeItem","_objectSpread","set","id","putToParent","o","parentNode","get","parentId","_parentNode$children","children","push","forEach","tree","filter","flatten","
|
|
1
|
+
{"version":3,"file":"tree-build.js","names":["treeFlatten","treeTrim","treeBuild","list","depth","arguments","length","undefined","nodeMap","Map","listClone","map","v","treeItem","_objectSpread","set","id","putToParent","o","parentNode","get","parentId","_parentNode$children","children","push","forEach","tree","filter","flatten","find","vv"],"sources":["../../../src/helper/tree-build.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nimport treeFlatten from './tree-flatten';\nimport treeTrim from './tree-trim';\n\n/**\n * 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表\n */\nexport default function treeBuild<T extends ITreeItemBase>(list: T[], depth = 0): TTreeItem<T>[] {\n const nodeMap = new Map<string, TTreeItem<T>>();\n const listClone: TTreeItem<T>[] = list.map((v: T) => {\n const treeItem: TTreeItem<T> = { // shallow clone\n ...v\n };\n \n nodeMap.set(treeItem.id, treeItem);\n \n return treeItem;\n });\n \n function putToParent(o: TTreeItem<T>): void {\n const parentNode = nodeMap.get(o.parentId);\n \n if (parentNode) {\n parentNode.children ??= [];\n parentNode.children.push(o);\n } else {\n o.parentId = ''; // wrong parent\n }\n }\n \n listClone.forEach(v => {\n if (v.parentId) {\n putToParent(v);\n }\n });\n \n const tree: TTreeItem<T>[] = listClone.filter(v => !v.parentId); // All top-level nodes\n \n // 若数据有自循环,则自循环的将不会在以上得到的树里\n const flatten = treeFlatten(tree);\n \n if (flatten.length !== list.length) { // 说明有循环,循环的会游离在树之外,需要收回来\n list.forEach(v => {\n if (!flatten.find(vv => vv.id === v.id)) {\n tree.push(v);\n }\n });\n }\n \n return depth > 0 ? treeTrim(tree, depth) : tree;\n}\n"],"mappings":";AAKA,OAAOA,WAAW,MAAM,gBAAgB;AACxC,OAAOC,QAAQ,MAAM,aAAa;;AAElC;AACA;AACA;AACA,eAAe,SAASC,SAASA,CAA0BC,IAAS,EAA6B;EAAA,IAA3BC,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EAC7E,IAAMG,OAAO,GAAG,IAAIC,GAAG,CAAuB,CAAC;EAC/C,IAAMC,SAAyB,GAAGP,IAAI,CAACQ,GAAG,CAAC,UAACC,CAAI,EAAK;IACnD,IAAMC,QAAsB,GAAAC,aAAA,KACvBF,CAAC,CACL;IAEDJ,OAAO,CAACO,GAAG,CAACF,QAAQ,CAACG,EAAE,EAAEH,QAAQ,CAAC;IAElC,OAAOA,QAAQ;EACjB,CAAC,CAAC;EAEF,SAASI,WAAWA,CAACC,CAAe,EAAQ;IAC1C,IAAMC,UAAU,GAAGX,OAAO,CAACY,GAAG,CAACF,CAAC,CAACG,QAAQ,CAAC;IAE1C,IAAIF,UAAU,EAAE;MAAA,IAAAG,oBAAA;MACd,CAAAA,oBAAA,GAAAH,UAAU,CAACI,QAAQ,cAAAD,oBAAA,cAAAA,oBAAA,GAAnBH,UAAU,CAACI,QAAQ,GAAK,EAAE;MAC1BJ,UAAU,CAACI,QAAQ,CAACC,IAAI,CAACN,CAAC,CAAC;IAC7B,CAAC,MAAM;MACLA,CAAC,CAACG,QAAQ,GAAG,EAAE,CAAC,CAAC;IACnB;EACF;EAEAX,SAAS,CAACe,OAAO,CAAC,UAAAb,CAAC,EAAI;IACrB,IAAIA,CAAC,CAACS,QAAQ,EAAE;MACdJ,WAAW,CAACL,CAAC,CAAC;IAChB;EACF,CAAC,CAAC;EAEF,IAAMc,IAAoB,GAAGhB,SAAS,CAACiB,MAAM,CAAC,UAAAf,CAAC;IAAA,OAAI,CAACA,CAAC,CAACS,QAAQ;EAAA,EAAC,CAAC,CAAC;;EAEjE;EACA,IAAMO,OAAO,GAAG5B,WAAW,CAAC0B,IAAI,CAAC;EAEjC,IAAIE,OAAO,CAACtB,MAAM,KAAKH,IAAI,CAACG,MAAM,EAAE;IAAE;IACpCH,IAAI,CAACsB,OAAO,CAAC,UAAAb,CAAC,EAAI;MAChB,IAAI,CAACgB,OAAO,CAACC,IAAI,CAAC,UAAAC,EAAE;QAAA,OAAIA,EAAE,CAACd,EAAE,KAAKJ,CAAC,CAACI,EAAE;MAAA,EAAC,EAAE;QACvCU,IAAI,CAACF,IAAI,CAACZ,CAAC,CAAC;MACd;IACF,CAAC,CAAC;EACJ;EAEA,OAAOR,KAAK,GAAG,CAAC,GAAGH,QAAQ,CAACyB,IAAI,EAAEtB,KAAK,CAAC,GAAGsB,IAAI;AACjD","ignoreList":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function treeTrimRecursive(tree, maxDepth, currentDepth) {
|
|
2
|
+
if (currentDepth >= maxDepth) {
|
|
3
|
+
tree.forEach(function (node) {
|
|
4
|
+
node.children = null;
|
|
5
|
+
delete node.children;
|
|
6
|
+
});
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
tree.forEach(function (node) {
|
|
10
|
+
var _node$children;
|
|
11
|
+
if ((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length) {
|
|
12
|
+
treeTrimRecursive(node.children, maxDepth, currentDepth + 1);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 修建树到最大深度(注意,此方法会直接修改原树)
|
|
19
|
+
*/
|
|
20
|
+
export default function treeTrim(tree, maxDepth) {
|
|
21
|
+
if (maxDepth < 1) {
|
|
22
|
+
return tree;
|
|
23
|
+
}
|
|
24
|
+
treeTrimRecursive(tree, maxDepth, 0);
|
|
25
|
+
return tree;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=tree-trim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-trim.js","names":["treeTrimRecursive","tree","maxDepth","currentDepth","forEach","node","children","_node$children","length","treeTrim"],"sources":["../../../src/helper/tree-trim.ts"],"sourcesContent":["import {\n ITreeItemBase,\n TTreeItem\n} from '../types';\n\nfunction treeTrimRecursive<T extends ITreeItemBase>(tree: TTreeItem<T>[], maxDepth: number, currentDepth: number): void {\n if (currentDepth >= maxDepth) {\n tree.forEach(node => {\n node.children = null;\n delete node.children;\n });\n \n return;\n }\n \n tree.forEach(node => {\n if (node.children?.length) {\n treeTrimRecursive(node.children, maxDepth, currentDepth + 1);\n }\n });\n}\n\n/**\n * 修建树到最大深度(注意,此方法会直接修改原树)\n */\nexport default function treeTrim<T extends ITreeItemBase>(tree: TTreeItem<T>[], maxDepth: number): TTreeItem<T>[] {\n if (maxDepth < 1) {\n return tree;\n }\n \n treeTrimRecursive(tree, maxDepth, 0);\n \n return tree;\n}\n"],"mappings":"AAKA,SAASA,iBAAiBA,CAA0BC,IAAoB,EAAEC,QAAgB,EAAEC,YAAoB,EAAQ;EACtH,IAAIA,YAAY,IAAID,QAAQ,EAAE;IAC5BD,IAAI,CAACG,OAAO,CAAC,UAAAC,IAAI,EAAI;MACnBA,IAAI,CAACC,QAAQ,GAAG,IAAI;MACpB,OAAOD,IAAI,CAACC,QAAQ;IACtB,CAAC,CAAC;IAEF;EACF;EAEAL,IAAI,CAACG,OAAO,CAAC,UAAAC,IAAI,EAAI;IAAA,IAAAE,cAAA;IACnB,KAAAA,cAAA,GAAIF,IAAI,CAACC,QAAQ,cAAAC,cAAA,eAAbA,cAAA,CAAeC,MAAM,EAAE;MACzBR,iBAAiB,CAACK,IAAI,CAACC,QAAQ,EAAEJ,QAAQ,EAAEC,YAAY,GAAG,CAAC,CAAC;IAC9D;EACF,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA,eAAe,SAASM,QAAQA,CAA0BR,IAAoB,EAAEC,QAAgB,EAAkB;EAChH,IAAIA,QAAQ,GAAG,CAAC,EAAE;IAChB,OAAOD,IAAI;EACb;EAEAD,iBAAiB,CAACC,IAAI,EAAEC,QAAQ,EAAE,CAAC,CAAC;EAEpC,OAAOD,IAAI;AACb","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export interface ITreeItemBase {\n id: string;\n parentId: string;\n}\n\nexport type TTreeItem<T extends ITreeItemBase> = T & {\n disabled?: boolean;\n children?: TTreeItem<T>[];\n};\n\n/**\n * 禁用树节点的模式\n *\n * - only - 仅禁用指定的节点\n * - downward - 向下级联,父节点被禁用,其所有子孙节点也自动标记\n * - upward - 向上级联,当所有子节点被禁用,其所有祖先节点也自动标记\n */\nexport type TTreeDisableMode = 'only' | 'downward' | 'upward';\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export interface ITreeItemBase {\n id: string;\n parentId: string;\n}\n\nexport type TTreeItem<T extends ITreeItemBase> = T & {\n disabled?: boolean;\n children?: TTreeItem<T>[] | null;\n};\n\n/**\n * 禁用树节点的模式\n *\n * - only - 仅禁用指定的节点\n * - downward - 向下级联,父节点被禁用,其所有子孙节点也自动标记\n * - upward - 向上级联,当所有子节点被禁用,其所有祖先节点也自动标记\n */\nexport type TTreeDisableMode = 'only' | 'downward' | 'upward';\n"],"mappings":"","ignoreList":[]}
|
|
@@ -2,5 +2,6 @@ export { default as treeBuild } from './tree-build';
|
|
|
2
2
|
export { default as treeFlatten } from './tree-flatten';
|
|
3
3
|
export { default as treeTraverse } from './tree-traverse';
|
|
4
4
|
export { default as treeFilter } from './tree-filter';
|
|
5
|
+
export { default as treeTrim } from './tree-trim';
|
|
5
6
|
export { default as treeMap } from './tree-map';
|
|
6
7
|
export { default as treeDisable } from './tree-disable';
|
|
@@ -2,4 +2,4 @@ import { ITreeItemBase, TTreeItem } from '../types';
|
|
|
2
2
|
/**
|
|
3
3
|
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
4
4
|
*/
|
|
5
|
-
export default function treeBuild<T extends ITreeItemBase>(list: T[]): TTreeItem<T>[];
|
|
5
|
+
export default function treeBuild<T extends ITreeItemBase>(list: T[], depth?: number): TTreeItem<T>[];
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kcuf/helper-tree",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "The tree data helper.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"sideEffects": false,
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
"@babel/cli": "^7.28.6",
|
|
26
26
|
"@babel/core": "^7.29.0",
|
|
27
27
|
"@babel/plugin-transform-runtime": "^7.29.0",
|
|
28
|
-
"@babel/preset-env": "^7.29.
|
|
28
|
+
"@babel/preset-env": "^7.29.2",
|
|
29
29
|
"@babel/preset-typescript": "^7.28.5",
|
|
30
|
-
"@vitest/coverage-v8": "^4.
|
|
30
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
31
31
|
"rimraf": "^6.1.3",
|
|
32
|
-
"typescript": "^
|
|
33
|
-
"vitest": "^4.
|
|
34
|
-
"@kcuf/ts-config": "^0.
|
|
32
|
+
"typescript": "^6.0.2",
|
|
33
|
+
"vitest": "^4.1.2",
|
|
34
|
+
"@kcuf/ts-config": "^0.2.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@babel/runtime": ">=7.0.0"
|