数据源:

    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);

参考:JS树形结构数据,根据子节点数据获取所有父节点数据

方法四:

可以获取父级节点的数据

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)

参考:JS根据子节点递归获取所有父节点的集合

相关文章:

js 通过id、pid遍历集合获得树结构

根据子节点ID获取结构树中该子节点的所有父节点ID的更多相关文章

  1. 解决el-tree lazy懒加载时,连续勾选前两个子节点后第二次进入默认选中时,将父节点也勾选的问题

    在用到el-tree的懒加载和默认勾选功能时,若第一次勾选前几个连续节点,第二次进入默认勾选时,由于el-tree子节点尚未完全加载(只加载出来前几个),默认勾选已经开始(已加载出来的子节点被默认勾选 ...

  2. 原生js通过最外层id获取下面指定的子元素

    需求:在vue中使用v-for循环出来的元素,设置动态id,之后获取下面的所有textarea标签 template: <table cellpadding = 2 v-for="(i ...

  3. EasyUI:combotree(树形下拉框)复选框选中父节点(子节点的状态也全部选中)输入框中只显示父节点的文本值

    参考: https://blog.csdn.net/weixin_43236850/article/details/100320564

  4. 找到树中指定id的所有父节点

    const data = [{ id: 1, children: [{ id: 2, children: [{ id: 3, }, { id: 4, }], }], }, { id: 5, child ...

  5. Jquery学习笔记:利用parent和parents方法获取父节点

    通过选择器一般只能获取指定标识的节点,或者获取子节点. 有些场景下,往往需要根据当前节点找到满足条件的父节点.这个可以通过相应的方法来实现. 1.parent方法 该方法可以获取元素的直接父节点. 我 ...

  6. treeview插件使用:根据子节点选中父节点

    鄙人公司没有专门的前端,所以项目开发中都是前后端一起抡.最近用bootstrap用的比较频繁,发现bootstrap除了框架本身的样式组件外,还提供了多种插件供开发者选择.本篇博文讲的就是bootst ...

  7. 红黑树之 原理和算法详细介绍(阿里面试-treemap使用了红黑树) 红黑树的时间复杂度是O(lgn) 高度<=2log(n+1)1、X节点左旋-将X右边的子节点变成 父节点 2、X节点右旋-将X左边的子节点变成父节点

    红黑树插入删除 具体参考:红黑树原理以及插入.删除算法 附图例说明   (阿里的高德一直追着问) 或者插入的情况参考:红黑树原理以及插入.删除算法 附图例说明 红黑树与AVL树 红黑树 的时间复杂度 ...

  8. 基于EasyUi ComBotree树修改 父节点选择问题

    本人在使用 Easy UI 期间发现了一个不太适合项目的bug,可能也不算bug把 . 毕竟不同项目背景 取舍不同. 我在做网元树选择的时候  发现当选取父节点后,子节点都会被选择  返回  .但是如 ...

  9. SpriteBuilder中同父节点的显示顺序

    如下图: 到目前为止,GameScene依赖于节点在SpriteBuilder中的顺序去决定其绘制的顺序. level content(_levelNode)被首先绘制,然后GameMenuLayer ...

  10. java list根据id获取子节点

    工作中因业务需求,将数据库中的树状结构的数据根据父节点获取所有的子节点 实现思路 1.获取整个数据的list集合数据 2.将数据分组,java8 list有groupby分组,java8之前的自己遍历 ...

随机推荐

  1. 文件上传的multipart/form-data属性,你理解了吗

    form表单经常用于前端发送请求,比如:用户填写信息.选择数据.上传文件,对于不同的场景,上传数据的格式也会有些区别. action action 表示该请求的 url 地址,定义在form上,请求的 ...

  2. CentOS7.9中的Glibc2.17源码编译升级到Glibc2.31

    一.准备工作 1.配置yum阿里镜像源 查看yum当前配置的仓库,如果yum配置的不是阿里云源,请配置阿里云源. yum repolist all 验证是否能ping通阿里云 # 如果不能ping通可 ...

  3. 这才叫 API 接口设计!

    API 接口设计 Token 设计 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上 ...

  4. 通过商品API接口获取到数据后的分析和应用

    一.如果你想要分析商品API接口获取到的数据,可以按照如下的步骤进行: 了解API接口返回值的格式,如JSON格式.XML格式.CSV格式等,选择适合你的数据分析方式. 使用API请求工具(如Post ...

  5. 【译】IntelliJ IDEA 2023.2 最新变化——JetBrains IDE 中的 AI 助手

    前言 本周所有基于 IntelliJ 的 IDE 和 .NET 工具的 EAP 版本都包含一个主要新功能:AI Assistant.本博文重点介绍我们基于 IntelliJ 的 IDE,并且即将推出专 ...

  6. Dami 基于事件总线的本地过程调用框架(首次发版)

    Dami,专为本地多模块之间通讯解耦而设计(尤其是未知模块.隔离模块.领域模块).零依赖,特适合 DDD. 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作异步响应. 支持事务 ...

  7. Oracle主键自增列

    SQL Server创建主键自增列我们可以使用"ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY"一步到位创建,而Oracle创建主键自增列和SQ ...

  8. ubuntu22.04.3 安装postgresql 16 rc1数据库

    ubuntu22.04.3 安装postgresql 16 rc1数据库 一.直接安装 # Create the file repository configuration: sudo sh -c ' ...

  9. Building-Mobile-Apps-with-Ionic-2中文翻译工作

    最近没啥工作量, 然后学完了这本书, 接着又茫然找不到该干啥, 所以想着何不翻译这个书呢. 这本书首先给我们普及了Ionic 2的基础知识, Ionic 2和Ionic 1有本质上的区别, Ionic ...

  10. 【NET 7.0、OpenGL ES】使用Silk.NET渲染MMD,并实时进行物理模拟。

    有关mmd播放器,网上也有许多非常漂亮的实现,如 pmxeditor.saba.blender_mmd_tools等等.. 首先我想先介绍下我参考实现的仓库: sselecirPyM/Coocoo3D ...