Files
hospital-rescue-app-v2/uni_modules/tmx-ui/components/x-cascader/util.uts
T
2026-09-24 16:25:22 +08:00

125 lines
2.8 KiB
Plaintext

import { CASCADER_TREE_ITEM, CASCADER_PATH_MENU_TYPE } from "../../interface.uts"
/**
* 当前树有多少个被选中了。
*/
export function getTreeSelectedNum(item : CASCADER_TREE_ITEM[], target : Set<string>) : number {
let inx = 0;
function jshz(tree : CASCADER_TREE_ITEM[]) {
for (let i = 0; i < tree.length; i++) {
let item = tree[i]
if (item.children.length > 0) {
jshz(item.children)
} else if (target.has(item.id)) {
inx += 1
}
}
}
jshz(item)
return inx;
}
/**
* 根据目标节点,过滤掉父节点。
* @param item
* @param target
*/
export function filterParentNode(item : CASCADER_TREE_ITEM[], target : Set<string>) : string[] {
function jshz(tree : CASCADER_TREE_ITEM[]) : string[] {
let arr = [] as string[]
for (let i = 0; i < tree.length; i++) {
let item = tree[i]
if (item.children.length > 0) {
arr = arr.concat(jshz(item.children))
} else if (target.has(item.id)) {
arr.push(item.id)
}
}
return arr;
}
return jshz(item)
}
/**
* 是否是父节点
* @param item
* @param target
*/
export function isParent(item : CASCADER_TREE_ITEM[], target : string) : boolean {
let parent = false;
function jshz(tree : CASCADER_TREE_ITEM[]) {
if (parent) {
return;
}
for (let i = 0; i < tree.length; i++) {
let item = tree[i]
if (item.id == target && item.children.length > 0) {
parent = true;
} else if (item.id != target && item.children.length > 0) {
jshz(item.children)
}
}
}
jshz(item)
return parent
}
/** 通过节点获取当前节点的索引路径和ids数组 */
export function getIndexPathAndIds(tree : CASCADER_TREE_ITEM[], targetId : string) : string[] {
const path : string[] = [];
function dfs(node : CASCADER_TREE_ITEM[]) : boolean {
for (let i = 0; i < node.length; i++) {
let item = node[i];
path.push(item.id);
if (item.id === targetId) {
return true;
}
if (dfs(item.children)) {
return true;
}
path.pop();
}
return false;
}
if (dfs(tree)) {
return path;
} else {
return [] as string[];
}
}
/** 通过节点获取当前节点的索引路径和ids数组 */
export function getTreeNodesPath(tree : CASCADER_TREE_ITEM[], targetId : string) : CASCADER_PATH_MENU_TYPE|null {
const path : string[] = [];
const indexPaths:number[] = [];
const pathData:CASCADER_TREE_ITEM[] = [];
function dfs(node : CASCADER_TREE_ITEM[]) : boolean {
for (let i = 0; i < node.length; i++) {
let item = node[i];
path.push(item.id);
indexPaths.push(i)
pathData.push(item)
if (item.id === targetId) {
return true;
}
if (dfs(item.children)) {
return true;
}
path.pop();
indexPaths.pop();
pathData.pop();
}
return false;
}
if (dfs(tree)) {
return {
indexPath:indexPaths,
ids:path,
pathData
} as CASCADER_PATH_MENU_TYPE;
}
return null
}