当前位置: 首页 > news >正文

树结构,转换

type TreeNode = {
children?: TreeNode[]
[key: string]: any
}

/**
* 给树结构补充 canSelect 字段
* 规则:
* 1. 当前级别 >= 3,可选
* 2. 当前级别 < 3,但没有子节点,也可选
* 3. 其他不可选
*
* @param tree 树数据
* @param level 起始层级,默认从 1 开始
* @returns 新树
*/
export function setTreeCanSelect<T extends TreeNode>(
tree: T[],
level = 1
): Array<T & { canSelect: boolean }> {
if (!Array.isArray(tree)) return []

return tree.map((node) => {
const children = Array.isArray(node.children) ? node.children : []
const hasChildren = children.length > 0

const canSelect = level >= 3 || !hasChildren

return {
...node,
canSelect,
children: hasChildren
? setTreeCanSelect(children, level + 1)
: []
}
})
}

取值

type TreeNode = {
label: string
value: string | number
children?: TreeNode[]
[key: string]: any
}

/**
* 树拍平
*/
function flattenTree(tree: TreeNode[]): TreeNode[] {
const result: TreeNode[] = []

const dfs = (nodes: TreeNode[]) => {
nodes.forEach((node) => {
result.push(node)
if (node.children && node.children.length) {
dfs(node.children)
}
})
}

dfs(tree)
return result
}

/**
* 根据 valueList 获取节点对象列表
*/
export function getNodesByValues(
tree: TreeNode[],
valueList: Array<string | number>
): TreeNode[] {
if (!Array.isArray(tree) || !Array.isArray(valueList)) return []

const flatList = flattenTree(tree)

const valueSet = new Set(valueList)

return flatList.filter((node) => valueSet.has(node.value))
}

http://www.jsqmd.com/news/692550/

相关文章:

  • AUTOSAR新手必看:ETAS ISOLAR里配置CAN模块,到底哪些项必须和EB Tresos保持一致?
  • 别再问端口不够用了!手把手教你调整Linux的net.ipv4.ip_local_port_range(附sysctl.conf永久生效方法)
  • 2026年3月最好的废水处理设备供应商推荐,水处理设备/废水处理设备,废水处理设备生产厂家哪家好 - 品牌推荐师
  • 深入理解3D数据集格式:从Nuscenes到KITTI的坐标系差异与统一实践
  • 告别复杂配置!用Auto.js的Java Socket在手机上5分钟搭建一个简易HTTP服务
  • 从PULSE到MAE:我的AI图像修复踩坑全记录(附Win10/Mac环境配置与百度云资源)
  • GetQzonehistory:一键备份你的QQ空间记忆,Python工具让数据永久保存
  • Claude Code 10 个隐藏技巧,90% 的人不知道!效率直接提升 300%
  • 5分钟极速上手:League Akari 智能工具包让您的英雄联盟体验焕然一新
  • 终极暗黑3按键助手:专业级游戏自动化宏配置完全指南
  • 2026年3月机床铸件直销厂家推荐,球墨铸件/铸铁平台/机床铸件,机床铸件实力厂家推荐 - 品牌推荐师
  • 如何高效部署tts-vue离线语音合成工具:3个关键配置方案解决实际应用问题
  • 20个真实世界机器学习案例解析与实战技巧
  • 别再手动建模块了!用SpringCloud多模块项目重构你的微服务(保姆级图文教程)
  • EasyExcel分批写入实战:规避.withTemplate陷阱,高效防OOM方案解析
  • 打造个性化Discord聊天机器人:角色扮演实战指南
  • 别再只读ADC值了!用STM32F103C8T6和土壤湿度传感器做个智能浇花系统(附完整代码)
  • 一文看懂:为什么说“理解+执行”是AI Agent工业化的分水岭
  • 用Python+Mediapipe做个AI跳绳教练:手势控制、自动校准,告别手动计数
  • RAGAs与G-Eval构建智能体评估体系实战
  • 从4G到5G的‘平滑升级’是真是假?一文拆解运营商选择NSA Option 3x背后的成本与运维困局
  • 用PyTorch逐行复现Transformer:从论文公式到可运行代码的保姆级解读
  • TypeScript类型体操:手把手教你用infer实现一个简易的‘类型提取’工具库
  • 时间序列建模避坑指南:你的AR模型真的‘平稳’吗?从统计性质反推参数设置
  • VSCode医疗数据校验速成课:3个插件+4类规则+1套CI/CD流程,今天就能上线合规校验
  • 深度伪造技术革命:roop-unleashed 架构解析与工程实践
  • 微信聊天记录永久保存:3步掌握WeChatMsg免费本地备份方案
  • Diablo Edit2:3步掌握暗黑破坏神2角色编辑终极指南,告别重复刷装备
  • 机器人会突然“死机”吗?坏了谁来修?多久能修好?
  • 深度学习核心架构与工业实践指南