function findIdList(data2, id, children = 'children', level = 0) {
var arrRes = []
let obj = {
id: 0,
[children]: data2
}
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.id == id) {
// 将匹配到的结果保存到数组
arrRes.unshift({ level, activeId: item.id })
// 递归它的父级
rev(obj, data.id, 0)
break
} else if (item[children] && item[children].length > 0) {
//如果有子集,则把子集作为参数重新执行本方法
rev(item, id, level + 1)
}
}
}
rev(obj, id, level)
return arrRes
}
let list = [
{id: 1, children: [
{id: 11, children: [{id: 12}]}
]},
{id: 2, children: [{id:21, children: [{id: 31}]}]}
]
let b = findIdList(list, 21)
console.log(b) // [ { level: 0, activeId: 2 }, { level: 1, activeId: 21 } ]
因为id是具有唯一性的,就好比身份证号码,一个id只能代表一个子元素,所以用 getElementById 方法可以立刻找到指定的子元素。
而类则不是唯一的,就比如“学生”是一个类,它代表的是一大群人,所以用 getElementsByClassName 方法返回的是一个对象集合而不是单个对象(即使类下面只有一个子元素),因此必须改成 ...getElementsByClassName('bt')[0].children
其实你只要够聪明,你就能从 getElementsByClassName 最中间的那个s想到原因了(s代表复数),而 getElementById 是没有s的!