js 递归树结构数据查找父级
1.json树数据查找所有父级--完成
json:树结构数据
var arrData = [{
"label": "中国",
"City": null,
"value": "",
"children": [{
"label": "河北",
"City": "",
"value": "",
"children": [{
"label": "石家庄",
"City": "",
"value": "1.1",
"children": null
},
{
"label": "保定",
"City": "",
"value": "1.2",
"children": null
},
{
"label": "邯郸",
"City": "",
"value": "1.3",
"children": [{
"label": "邯山区",
"City": "1.3",
"value": "1.3.1",
"children": [{
"label": "丛西街道",
"City": "1.3.1",
"value": "1.3.1.1",
"children": null
}]
},
{
"label": "涉县",
"City": "1.3",
"value": "1.3.2",
"children": null
},
{
"label": "丛台区",
"City": "1.3",
"value": "1.3.3",
"children": null
}
]
}
]
},
{
"label": "山东",
"City": "",
"value": "",
"children": [{
"label": "济南",
"City": "",
"value": "2.1",
"children": null
}]
},
{
"label": "北京",
"City": "",
"value": "",
"children": null
} ]
}];
递归查找父级数据
// data:json nodeId:节点,arrRes:[] 返回的数据
function getParentNode(data, nodeId, arrRes) {
if (!data ) {
if (!nodeId) {
arrRes.unshift(nodeId);
}
return arrRes;
}
for (var i = , length = data.length; i < length; i++) {
let node = data[i];
if (node.value == nodeId) {
arrRes.unshift(nodeId);
console.log(arrData);
getParentNode(arrData, node.City, arrRes);
break;
}
else {
if (!!node.children) {
getParentNode(node.children, nodeId, arrRes);
}
} }
return arrRes;
};
调用: var res = getParentNode(arrData, '1.3.1', []);
2.再次修改后:
// data:json, nodeId:节点
function getParent(data2, nodeId2) {
var arrRes = [];
if (data2.length == ) {
if (!!nodeId2) {
arrRes.unshift(nodeId2);
}
return arrRes;
}
let rev = (data, nodeId) => {
for (var i = , length = data.length; i < length; i++) {
let node = data[i];
if (node.value == nodeId) {
arrRes.unshift(nodeId);
rev(data2, node.City);
break;
}
else {
if (!!node.children) {
rev(node.children, nodeId);
}
}
}
return arrRes;
};
arrRes = rev(data2, nodeId2);
return arrRes;
}
调用:var res = getParent(arrData, '1.3.1');
3. 正则表达式 查找的,递归20级深度的;
var getValue=(function () {
var arrData = [{
"label": "中国",
"City": null,
"value": "",
"children": [{
"label": "河北",
"City": "",
"value": "hb",
"children": [{
"label": "石家庄",
"City": "",
"value": "1.1",
"children": null
},
{
"label": "保定",
"City": "",
"value": "1.2",
"children": null
},
{
"label": "邯郸",
"City": "n",
"value": "bk",
"children": [{
"label": "邯山区",
"City": "bk",
"value": "1.3.1",
"children": [{
"label": "丛西街道",
"City": "1.3.1",
"value": "1.3.1.1",
"children": null
}]
},
{
"label": "涉县",
"City": "1.3",
"value": "1.3.2",
"children": null
},
{
"label": "丛台区",
"City": "1.3",
"value": "1.3.3",
"children": null
}
]
}
]
},
{
"label": "山东",
"City": "",
"value": "",
"children": [{
"label": "济南",
"City": "",
"value": "2.1",
"children": null
}]
},
{
"label": "北京",
"City": "",
"value": "",
"children": null
} ]
}];
console.log(JSON.stringify(arrData[]))
return function getValue(values){
var arrs=[];
var values=values;
var c=JSON.stringify(arrData[]);
var keys='';
if(arguments[]&&c.search(values)!=-){
for(var i=;i<;i++){
var newReg=new RegExp('\"City\"\:\"([^\"]+)\"\,\"value\"\:\"'+values);
if(values!=keys){
arrs.unshift(values)
}
if(c.search(newReg)!=-){
keys=c.match(newReg)[].replace(newReg,'$1')
arrs.unshift(keys);
values=keys;
}else{
arrs.unshift(null)
return arrs;
}
}}else{
return values
}
}
})(); console.log(getValue('1.3.1'))
4.Cascader 级联选择 组件 v-model的数据是一个数组类型,工作中如果需要回显的话,就需要传递所有父级元素的ID所组成的数组,但是后台只存放了目标元素的ID,所以只能自己去遍历数据获取了
用递归查找到ID的所属元素,然后把每一级的parentId一起返回。
转:https://blog.csdn.net/weixin_42869548/article/details/82012316
[{
"orgId": ,
"orgName": "校长办公室1",
"parentId": ,
"children": [{
"orgId": ,
"orgName": "校长办公室2",
"parentId": ,
"children": [{
"orgId": ,
"orgName": "校长办公室3",
"parentId": ,
}]
}]
}]
function buildParentList(arr){
arr.forEach(g =>
{
if(g.parentId != undefined) {
let pid = g['parentId']
let oid = g['orgId']
parentList[oid] = pid
}
if (g.children != undefined)
buildParentList(g['children'])
})
}
function findParent(idx){
if (parentList[idx] != undefined){
let pid = parentList[idx]
console.log(pid)
findParent(pid)
}
} buildParentList(list)
findParent(); // 0 1 2
findParent(); // 0 1
findParent(); // undefined
5.从上往下找下的
function getParents(data, id) {
for (var i in data) {
if (data[i].value == id) {
return [];
}
if (data[i].children) {
var ro = getParents(data[i].children, value);
if (ro !== undefined)
return ro.concat(data[i].id);
}
}
console.log(ro);
}
js 递归树结构数据查找父级的更多相关文章
- Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?如何自定义用户函数并调用?
开门见山,首先说下遇到的问题:前期系统地区字典表中,每个省市县只存了本级名称,没存完整的字段.如:肥西县隶属安徽省合肥市,表中就存了一个肥西县.现有需求需要将完整字段显示,由于系统已在线上运营,无法做 ...
- JS - 点击事件排除父级标签
点击事件排除父级标签,这里使用的是stopPropagation()方法.event.stopPropagation(); 对了,这里还用了解除click事件,unbind. 下面这篇博文,介绍挺全的 ...
- JS-对象查找父级
之前在寻找两个以上的父级,一直傻傻的用parent().parent()... 今天,需要写五个,当然以前也是写过五个的,但是今天总想着换个简单的方式,至少不要.parent().parent().p ...
- js动态绑定class(当前父级div下的子元素有没有这个class,有的话移除,没有的话添加)
<div class="layui-inline" id=‘’ onclick="changeType(id)"> ...
- php中递归查找父级名称
/** * 获取所属公司 * @param array 列表 * @param $id 上级ID * @return array */ private static function get_top_ ...
- JS获取节点的兄弟,父级,子级元素的方法(js获取子级获取到换行与空格元素-FF)
先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 < ...
- js或jquery如何获取父级、子级、兄弟元素(包括祖级、孙级等)
原生javascript方法: var a = document.getElementById("dom"); del_space(a); //清理空格 var b = a.chi ...
- dom node 查找父级parentNode
var o = document.querySelectorAll("a[href='baidu.com']"); var p = o[o.length-1];console.lo ...
- js根据子目录数目显示父级目录
需求:<ul>中<li>数量为0,则不显示<ul>以及<b>:<div>中<ul>数量为0,则不显示<div> 1. ...
随机推荐
- 聊聊 JDK 非阻塞队列源码(CAS实现)
正如上篇文章聊聊 JDK 阻塞队列源码(ReentrantLock实现)所说,队列在我们现实生活中队列随处可见,最经典的就是去银行办理业务,超市买东西排队等.今天楼主要讲的就是JDK中安全队列的另一种 ...
- MongoDB高级知识
MongoDB高级知识 一.mongodb适合场景: 1.读写分离:MongoDB服务采用三节点副本集的高可用架构,三个数据节点位于不同的物理服务器上,自动同步数据.Primary和Secondary ...
- [转]解读Unity中的CG编写Shader系列5——理论知识
经过前面的系列文章中的三个例子,尽管代码简单,但是我想应该还有些地方没有100%弄明白,我们现在得回过头来补充一些必备的数学.图形学知识 1.图形管道第一个例子中我有提到顶点着色和片段着色在整个图形绘 ...
- [Maven实战-许晓斌]-[第二章]-2.2基于UNIX系统安装maven
>> >> >>3
- [Swift]多维数组的表示和存储:N维数组映射到一维数组(一一对应)!
数组:有序的元素序列. 若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用于区分数组的各个元素的数字编号称为下标.数组 ...
- 10分钟教你用VS2017将代码上传到GitHub
前言 关于微软的Visual Studio系列,真可谓是宇宙最强IDE了.不过,像小编这样的菜鸟级别也用不到几个功能.今天给大家介绍一个比较实用的功能吧,把Visual Studio 2017里面写好 ...
- P3366 (模板)最小生成树
2019-01-30 最小生成树基本算法 定义: 给定一个边带权的无向图G=(V,E),n=|V|,m=|E|,由V中全部n个定点和E中n-1条边构成的无向连通子图被称为G的一颗生成树. 边的权值之和 ...
- 2016级算法第二次上机-B.Bamboo的OS实验
Bamboo的OS实验 分析 首先理解题意,要完成不同数量的不同命令,但是完成相同的命令之间必须有n个间隔,为使得时间最短,自然优先用其他命令来填充这n分钟的时间,由于数量少的命令可以用来填充空隙,所 ...
- CSS3 文本溢出问题
一.单行: 效果: 实现这各效果必须要加上: text-overflow: ellipsis; /*文本溢出*/ overflow: hidden; /*配合使用:溢出隐藏*/ white-space ...
- [转] 打造基于CentOS7的xfce最简工作环境[转自smstong,在此记录一下]
[From]https://blog.csdn.net/hejianlz/article/details/78976013 3 安装步骤 3.1 执行CentOS7 最小安装 去官网下载CentOS- ...