@kcuf/helper-tree 0.2.0 → 0.2.2
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/dist/cjs/helper/tree-build.js +2 -2
- package/dist/cjs/helper/tree-trim.js +8 -8
- package/dist/esm/helper/tree-build.js +2 -2
- package/dist/esm/helper/tree-build.js.map +1 -1
- package/dist/esm/helper/tree-trim.js +8 -8
- package/dist/esm/helper/tree-trim.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/helper/tree-build.d.ts +1 -1
- package/dist/types/helper/tree-trim.d.ts +2 -2
- package/dist/types/types/index.d.ts +1 -1
- package/package.json +3 -3
|
@@ -12,7 +12,7 @@ var _treeTrim = _interopRequireDefault(require("./tree-trim"));
|
|
|
12
12
|
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
13
13
|
*/
|
|
14
14
|
function treeBuild(list) {
|
|
15
|
-
var
|
|
15
|
+
var maxLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
16
16
|
var nodeMap = new Map();
|
|
17
17
|
var listClone = list.map(function (v) {
|
|
18
18
|
var treeItem = (0, _objectSpread2.default)({}, v);
|
|
@@ -50,5 +50,5 @@ function treeBuild(list) {
|
|
|
50
50
|
}
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
|
-
return
|
|
53
|
+
return maxLevel > 0 ? (0, _treeTrim.default)(tree, maxLevel) : tree;
|
|
54
54
|
}
|
|
@@ -4,10 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = treeTrim;
|
|
7
|
-
function treeTrimRecursive(tree,
|
|
8
|
-
if (
|
|
7
|
+
function treeTrimRecursive(tree, maxLevel, currentLevel) {
|
|
8
|
+
if (currentLevel >= maxLevel) {
|
|
9
9
|
tree.forEach(function (node) {
|
|
10
|
-
node.children =
|
|
10
|
+
node.children = undefined;
|
|
11
11
|
delete node.children;
|
|
12
12
|
});
|
|
13
13
|
return;
|
|
@@ -15,18 +15,18 @@ function treeTrimRecursive(tree, maxDepth, currentDepth) {
|
|
|
15
15
|
tree.forEach(function (node) {
|
|
16
16
|
var _node$children;
|
|
17
17
|
if ((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length) {
|
|
18
|
-
treeTrimRecursive(node.children,
|
|
18
|
+
treeTrimRecursive(node.children, maxLevel, currentLevel + 1);
|
|
19
19
|
}
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* 修建树(注意,此方法会直接修改原树)
|
|
25
25
|
*/
|
|
26
|
-
function treeTrim(tree,
|
|
27
|
-
if (
|
|
26
|
+
function treeTrim(tree, maxLevel) {
|
|
27
|
+
if (maxLevel < 1) {
|
|
28
28
|
return tree;
|
|
29
29
|
}
|
|
30
|
-
treeTrimRecursive(tree,
|
|
30
|
+
treeTrimRecursive(tree, maxLevel, 1);
|
|
31
31
|
return tree;
|
|
32
32
|
}
|
|
@@ -6,7 +6,7 @@ import treeTrim from './tree-trim';
|
|
|
6
6
|
* 将平铺的(已标准化 `id` 和 `parentId`)数据转成树节点列表
|
|
7
7
|
*/
|
|
8
8
|
export default function treeBuild(list) {
|
|
9
|
-
var
|
|
9
|
+
var maxLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
10
10
|
var nodeMap = new Map();
|
|
11
11
|
var listClone = list.map(function (v) {
|
|
12
12
|
var treeItem = _objectSpread({}, v);
|
|
@@ -44,6 +44,6 @@ export default function treeBuild(list) {
|
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
|
-
return
|
|
47
|
+
return maxLevel > 0 ? treeTrim(tree, maxLevel) : tree;
|
|
48
48
|
}
|
|
49
49
|
//# sourceMappingURL=tree-build.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-build.js","names":["treeFlatten","treeTrim","treeBuild","list","
|
|
1
|
+
{"version":3,"file":"tree-build.js","names":["treeFlatten","treeTrim","treeBuild","list","maxLevel","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[], maxLevel = 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 maxLevel > 0 ? treeTrim(tree, maxLevel) : tree;\n}\n"],"mappings":";AAKA,OAAOA,WAAW,MAAM,gBAAgB;AACxC,OAAOC,QAAQ,MAAM,aAAa;;AAElC;AACA;AACA;AACA,eAAe,SAASC,SAASA,CAA0BC,IAAS,EAAgC;EAAA,IAA9BC,QAAQ,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC;EAChF,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,QAAQ,GAAG,CAAC,GAAGH,QAAQ,CAACyB,IAAI,EAAEtB,QAAQ,CAAC,GAAGsB,IAAI;AACvD","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
function treeTrimRecursive(tree,
|
|
2
|
-
if (
|
|
1
|
+
function treeTrimRecursive(tree, maxLevel, currentLevel) {
|
|
2
|
+
if (currentLevel >= maxLevel) {
|
|
3
3
|
tree.forEach(function (node) {
|
|
4
|
-
node.children =
|
|
4
|
+
node.children = undefined;
|
|
5
5
|
delete node.children;
|
|
6
6
|
});
|
|
7
7
|
return;
|
|
@@ -9,19 +9,19 @@ function treeTrimRecursive(tree, maxDepth, currentDepth) {
|
|
|
9
9
|
tree.forEach(function (node) {
|
|
10
10
|
var _node$children;
|
|
11
11
|
if ((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length) {
|
|
12
|
-
treeTrimRecursive(node.children,
|
|
12
|
+
treeTrimRecursive(node.children, maxLevel, currentLevel + 1);
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* 修建树(注意,此方法会直接修改原树)
|
|
19
19
|
*/
|
|
20
|
-
export default function treeTrim(tree,
|
|
21
|
-
if (
|
|
20
|
+
export default function treeTrim(tree, maxLevel) {
|
|
21
|
+
if (maxLevel < 1) {
|
|
22
22
|
return tree;
|
|
23
23
|
}
|
|
24
|
-
treeTrimRecursive(tree,
|
|
24
|
+
treeTrimRecursive(tree, maxLevel, 1);
|
|
25
25
|
return tree;
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=tree-trim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-trim.js","names":["treeTrimRecursive","tree","
|
|
1
|
+
{"version":3,"file":"tree-trim.js","names":["treeTrimRecursive","tree","maxLevel","currentLevel","forEach","node","children","undefined","_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>[], maxLevel: number, currentLevel: number): void {\n if (currentLevel >= maxLevel) {\n tree.forEach(node => {\n node.children = undefined;\n delete node.children;\n });\n \n return;\n }\n \n tree.forEach(node => {\n if (node.children?.length) {\n treeTrimRecursive(node.children, maxLevel, currentLevel + 1);\n }\n });\n}\n\n/**\n * 修建树(注意,此方法会直接修改原树)\n */\nexport default function treeTrim<T extends ITreeItemBase>(tree: TTreeItem<T>[], maxLevel: number): TTreeItem<T>[] {\n if (maxLevel < 1) {\n return tree;\n }\n \n treeTrimRecursive(tree, maxLevel, 1);\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,GAAGC,SAAS;MACzB,OAAOF,IAAI,CAACC,QAAQ;IACtB,CAAC,CAAC;IAEF;EACF;EAEAL,IAAI,CAACG,OAAO,CAAC,UAAAC,IAAI,EAAI;IAAA,IAAAG,cAAA;IACnB,KAAAA,cAAA,GAAIH,IAAI,CAACC,QAAQ,cAAAE,cAAA,eAAbA,cAAA,CAAeC,MAAM,EAAE;MACzBT,iBAAiB,CAACK,IAAI,CAACC,QAAQ,EAAEJ,QAAQ,EAAEC,YAAY,GAAG,CAAC,CAAC;IAC9D;EACF,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA,eAAe,SAASO,QAAQA,CAA0BT,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>[]
|
|
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":[]}
|
|
@@ -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[],
|
|
5
|
+
export default function treeBuild<T extends ITreeItemBase>(list: T[], maxLevel?: number): TTreeItem<T>[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ITreeItemBase, TTreeItem } from '../types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* 修建树(注意,此方法会直接修改原树)
|
|
4
4
|
*/
|
|
5
|
-
export default function treeTrim<T extends ITreeItemBase>(tree: TTreeItem<T>[],
|
|
5
|
+
export default function treeTrim<T extends ITreeItemBase>(tree: TTreeItem<T>[], maxLevel: number): TTreeItem<T>[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kcuf/helper-tree",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "The tree data helper.",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"@babel/plugin-transform-runtime": "^7.29.0",
|
|
28
28
|
"@babel/preset-env": "^7.29.2",
|
|
29
29
|
"@babel/preset-typescript": "^7.28.5",
|
|
30
|
-
"@vitest/coverage-v8": "^4.1.
|
|
30
|
+
"@vitest/coverage-v8": "^4.1.3",
|
|
31
31
|
"rimraf": "^6.1.3",
|
|
32
32
|
"typescript": "^6.0.2",
|
|
33
|
-
"vitest": "^4.1.
|
|
33
|
+
"vitest": "^4.1.3",
|
|
34
34
|
"@kcuf/ts-config": "^0.2.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|