假设有这样一个树结构,你现在有id5,如何获取对应的12并组成数组[1,2,5]呢?
再假设不规则数组如下
var array = [
{ id: 1, name: '买笔', done: true, children: '' },
{ id: 2, name: '买笔记本', done: true, children: [
{ id: 3, name: '2买笔', done: true },
{ id: 4, name: '2买笔记本', done: true },
{ id: 5, name: '2练字', done: false, children: [
{ id: 7, name: '3买笔', done: true },
{ id: 8, name: '3买笔记本', done: true },
{ id: 9, name: '3练字', done: false, children: [
{ id: 10, name: '4买笔', done: true },
{ id: 11, name: '4买笔记本', done: true },
{ id: 12, name: '4练字', done: false }
] }
] }
] },
{ id: 6, name: '练字', done: false, children: [
{ id: 13, name: '5买笔', done: true },
{ id: 14, name: '5买笔记本', done: true, children: [
{ id: 16, name: '6买笔', done: true },
{ id: 17, name: '6买笔记本', done: true },
{ id: 18, name: '6练字', done: false }
] },
{ id: 15, name: '5练字', done: false }
] }
]
获取到的id为16,如何获取他的父元素id=14和爷爷元素id=6
解决办法:首先是使用forEach遍历整个数组对象,然后比对id是不是为16,是的话一直回调当前所在对象。就比如id=16,先是回调16所在对象,接下来回调id14所在的对象,最后回调id6所在的对象,这个三个组成一个新的数组,就能生成id16的树节点路径了。
let placeList = []
let num = 0
function traverse(obj, id, callback) {
for (var a in obj) {
if (typeof (obj[a]) === 'object') {
if (obj[a].id == id) {
placeList[num] = obj[a]
num++
callback(obj[a])
return
} else if (obj[a]?.length > 0 || obj[a]?.children?.length > 0) {
traverse(obj[a], id, data => {
if (typeof (data) === 'object') {
placeList[num] = obj[a]
num++
callback(obj[a])
}
}) // 递归遍历
} else if (obj[a].id == id) {
placeList[num] = obj[a]
num++
callback(obj[a])
return
// console.log(a + '=' + JSON.stringify(obj)) // 如果是值就显示
}
}
}
}
递归回调callback回来的是id16所在的分支,placeList 存放的是树节点路径数组,?.符号是最新的es提案可选链,不清楚的可以百度下。
getTreeNode() {
console.log('---------------------------')
var array = [
{ id: 1, name: '买笔', done: true, children: '' },
{ id: 2, name: '买笔记本', done: true, children: [
{ id: 3, name: '2买笔', done: true },
{ id: 4, name: '2买笔记本', done: true },
{ id: 5, name: '2练字', done: false, children: [
{ id: 7, name: '3买笔', done: true },
{ id: 8, name: '3买笔记本', done: true },
{ id: 9, name: '3练字', done: false, children: [
{ id: 10, name: '4买笔', done: true },
{ id: 11, name: '4买笔记本', done: true },
{ id: 12, name: '4练字', done: false }
] }
] }
] },
{ id: 6, name: '练字', done: false, children: [
{ id: 13, name: '5买笔', done: true },
{ id: 14, name: '5买笔记本', done: true, children: [
{ id: 16, name: '6买笔', done: true },
{ id: 17, name: '6买笔记本', done: true },
{ id: 18, name: '6练字', done: false }
] },
{ id: 15, name: '5练字', done: false }
] }
]
// 遍历多维数组
console.log("开始时间:" + new Date().getTime())
traverse(array, 16, data => console.log(data))
console.log("结束时间:" + new Date().getTime())
console.log(placeList)
},
最后输出的结果:
再对placeList数组操作下就可以根据区县id获取所在的省市id了,同时遍历不规则数组并获得节点路径也完成了
注意 : 再次遍历时placeList和num一定要重置,不然全局属性可能会隐藏bug