根据子节点ID获取结构树中该子节点的所有父节点ID
数据源:
let adreeJson = [{
cat_id: 1,
cat_name: '大家电',
cat_pid: 0,
cat_level: 0,
cat_deleted: false,
children: [
{
cat_id: 3,
cat_name: '电视',
cat_pid: 1,
cat_level: 1,
cat_deleted: false,
children: [{
cat_id: 6,
cat_name: '曲面电视',
cat_pid: 3,
cat_level: 2,
cat_deleted: false,
}]
},
{
cat_id: 5,
cat_name: '空调',
cat_pid: 1,
cat_level: 1,
cat_deleted: false,
children: [{
cat_id: 8,
cat_name: '壁挂空调',
cat_pid: 5,
cat_level: 2,
cat_deleted: false,
}]
}
]
}]
方法一:
// 根据子id找父id,返回值不包含查找的id
function findParentsId(treeData, id) {
if (treeData.length == 0) return
for (let i = 0; i < treeData.length; i++) {
if (treeData[i].cat_id == id) {
return []
} else {
if (treeData[i].children) {
let res = findParentsId(treeData[i].children, id)
if (res !== undefined) {
return res.concat(treeData[i].cat_id).reverse()
}
}
}
}
}
function orgChildIdFindParent(childId, orgList) {
const result = findParentsId(orgList, childId).concat(childId)
return result || []
}
// 使用
let _arryDt = orgChildIdFindParent(6, adreeJson)
console.log(_arryDt)
方法二:
function doMatch(treeData, key) {
let arr = [];
let returnArr = [];
let depth = 0;
function childrenEach(childrenData, depthN) {
for (let j = 0; j < childrenData.length; j++) {
depth = depthN;
arr[depthN] = childrenData[j].cat_id;
if (childrenData[j].cat_id == key) {
returnArr = arr.slice(0, depthN + 1);
break;
} else {
if (childrenData[j].children) {
depth++;
childrenEach(childrenData[j].children, depth);
}
}
}
return returnArr;
}
return childrenEach(treeData, depth);
}
let arr = doMatch(adreeJson, 8);//Arr是后台返回的整个数组 id是获取当前节点的id
console.log(arr)//获取包括当前节点和所有父节点的id
方法三:
可以自定义取父级的key值
/**
* 显示层级数据
* @param tree {Array} 树数据
* @param func {Function} 回调函数
* @param field {String} 字段名称
* @param path {Array} 路径数据
* @returns {*[]|[]|*}
*/
function treeFindPath(tree, func, field = "", path = []) {
if (!tree) return []
for (const data of tree) {
field === "" ? path.push(data) : path.push(data[field]);
if (func(data)) return path
if (data.children) {
const findChildren = treeFindPath(data.children, func, field, path)
if (findChildren.length) return findChildren
}
path.pop()
}
return []
}
let arr = treeFindPath(adreeJson, data => data.cat_id === 6, "cat_id");
let _nameArr=treeFindPath(adreeJson, data => data.cat_id === 6, "cat_name");
console.log(arr);
console.log(_nameArr);
方法四:
可以获取父级节点的数据
function findIdList(list, id, children = 'children', level = 0) {
var arrRes = [];
let obj = {
cat_id: 0,
[children]: list
}
let rev = (data, id, level) => {
if (!data || !data[children] || !data[children].length) {
return;
}
for (var i = 0; i < data[children].length; i++) {
let item = data[children][i];
if (item.cat_id == id) {
let _obj = {
...item
}
delete _obj.children
arrRes.unshift({
level,
..._obj
});
// arrRes.unshift({
// level,
// cat_id: item.cat_id,
// cat_name: item.cat_name,
// cat_pid: item.cat_pid,
// cat_level: item.cat_level,
// cat_deleted: item.cat_deleted,
// });
// 递归它的父级
rev(obj, data.cat_id, 0);
break;
} else if (item[children] && item[children].length > 0) {
//如果有子集,则把子集作为参数重新执行本方法
rev(item, id, level + 1);
}
}
};
rev(obj, id, level);
return arrRes;
}
let pDt = findIdList(adreeJson, 6);
console.log(pDt)
相关文章:
根据子节点ID获取结构树中该子节点的所有父节点ID的更多相关文章
- 解决el-tree lazy懒加载时,连续勾选前两个子节点后第二次进入默认选中时,将父节点也勾选的问题
在用到el-tree的懒加载和默认勾选功能时,若第一次勾选前几个连续节点,第二次进入默认勾选时,由于el-tree子节点尚未完全加载(只加载出来前几个),默认勾选已经开始(已加载出来的子节点被默认勾选 ...
- 原生js通过最外层id获取下面指定的子元素
需求:在vue中使用v-for循环出来的元素,设置动态id,之后获取下面的所有textarea标签 template: <table cellpadding = 2 v-for="(i ...
- EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值
参考: https://blog.csdn.net/weixin_43236850/article/details/100320564
- 找到树中指定id的所有父节点
const data = [{ id: 1, children: [{ id: 2, children: [{ id: 3, }, { id: 4, }], }], }, { id: 5, child ...
- Jquery学习笔记:利用parent和parents方法获取父节点
通过选择器一般只能获取指定标识的节点,或者获取子节点. 有些场景下,往往需要根据当前节点找到满足条件的父节点.这个可以通过相应的方法来实现. 1.parent方法 该方法可以获取元素的直接父节点. 我 ...
- treeview插件使用:根据子节点选中父节点
鄙人公司没有专门的前端,所以项目开发中都是前后端一起抡.最近用bootstrap用的比较频繁,发现bootstrap除了框架本身的样式组件外,还提供了多种插件供开发者选择.本篇博文讲的就是bootst ...
- 红黑树之 原理和算法详细介绍(阿里面试-treemap使用了红黑树) 红黑树的时间复杂度是O(lgn) 高度<=2log(n+1)1、X节点左旋-将X右边的子节点变成 父节点 2、X节点右旋-将X左边的子节点变成父节点
红黑树插入删除 具体参考:红黑树原理以及插入.删除算法 附图例说明 (阿里的高德一直追着问) 或者插入的情况参考:红黑树原理以及插入.删除算法 附图例说明 红黑树与AVL树 红黑树 的时间复杂度 ...
- 基于EasyUi ComBotree树修改 父节点选择问题
本人在使用 Easy UI 期间发现了一个不太适合项目的bug,可能也不算bug把 . 毕竟不同项目背景 取舍不同. 我在做网元树选择的时候 发现当选取父节点后,子节点都会被选择 返回 .但是如 ...
- SpriteBuilder中同父节点的显示顺序
如下图: 到目前为止,GameScene依赖于节点在SpriteBuilder中的顺序去决定其绘制的顺序. level content(_levelNode)被首先绘制,然后GameMenuLayer ...
- java list根据id获取子节点
工作中因业务需求,将数据库中的树状结构的数据根据父节点获取所有的子节点 实现思路 1.获取整个数据的list集合数据 2.将数据分组,java8 list有groupby分组,java8之前的自己遍历 ...
随机推荐
- 论文解读(APCA)《Adaptive prototype and consistency alignment for semi-supervised domain adaptation》
[ Wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Adaptive prototype and consistency alignment for semi-super ...
- JavaScript中单例模式这样用
如果希望自己的代码更优雅.可维护性更高以及更简洁,往往离不开设计模式这一解决方案. 在JS设计模式中,最核心的思想:封装变化(将变与不变分离,确保变化的部分灵活,不变的部分稳定). 单例模式 那么来说 ...
- 论文解读(MetaAdapt)《MetaAdapt: Domain Adaptive Few-Shot Misinformation Detection via Meta Learning》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:MetaAdapt: Domain Adaptive Few-Shot Misinformation De ...
- vscod 配置 morkdown 快捷键
vscod 配置 morkdown 快捷键 1.首先在根目录添加.vscode 文件夹 ️1.1 新建一个 settings.json 文件 { "[markdown]": { & ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
在我们创建界面元素的时候,不管在Vue3+ElementPlus的前端上,还是Winform桌面端上,都是会利用自定义用户控件来快速重用一些自定义的界面内容,对自定义用户控件的封装处理,也是我们开发W ...
- python入门基础(13)--类、对象
面向过程的编程语言,如C语言,所使用的数据和函数之间是没有任何直接联系的,它们之间是通过函数调用提供参数的形式将数据传入函数进行处理. 但可能因为错误的传递参数.错误地修改了数据而导致程序出错,甚至是 ...
- Solution -「CF 1096E」The Top Scorer
Description Link. 小明在打比赛,包括小明自己一共有 \(p\) 名选手参赛,每个人的得分是一个非负整数.最后的冠军是得分最高的人,如果得分最高的人有多个,就等概率从这些人中选一个当冠 ...
- Vitess全局唯一ID生成的实现方案
为了标识一段数据,通常我们会为其指定一个唯一id,比如利用MySQL数据库中的自增主键. 但是当数据量非常大时,仅靠数据库的自增主键是远远不够的,并且对于分布式数据库只依赖MySQL的自增id无法满足 ...
- 什么是vfs以及它的作用
VFS(Virtual File System,虚拟文件系统)是计算机操作系统中的一个概念,它提供了一个统一的抽象层,使得操作系统可以支持不同的文件系统类型和存储设备,而不需要直接与每个文件系统进行交 ...
- socket应用的例子
当使用 C 语言实现 Socket 编程时,可以通过系统提供的网络库来实现网络通信.以下是一个简单的示例,演示了如何创建一个简单的服务器和客户端,实现客户端向服务器发送消息并接收回复的功能. 服务器端 ...