我有一个数组对象:
let treeObj = {
'1': [
{ '2': [{ '5': [{ '11': '11' }, { '12': '12' }, { '13': '13' }, { '14': '14' }] }] },
{ '3': [{ '6': '6' }, { '7': '7' }] },
{ '4': [{ '8': '8' }, { '9': '9' }, { '10': '10' }] }
]
}
通过先序遍历
的方法,我能够按顺序取得所有的key
值:
let traverseNode = (node) => {
if (typeof node !== 'string') {
let key = Object.keys(node)
console.log(key)
for (let i = 0; i < node[key].length; i++) {
traverseNode(node[key][i])
}
}
}
traverseNode(treeObj)
/* 输出结果如下
[ '1' ]
[ '2' ]
[ '5' ]
[ '11' ]
[ '12' ]
[ '13' ]
[ '14' ]
[ '3' ]
[ '6' ]
[ '7' ]
[ '4' ]
[ '8' ]
[ '9' ]
[ '10' ]
*/
现在我想知道每一个key
值所在的层数
,比如['1']
在第1层,[ '2' ][ '3' ][ '4' ]
在第2层,请问应该怎么做呢?
谢谢!
加个标志就OK了
let traverseNode = (node, lv = 0) => {
if (typeof node !== 'string') {
let key = Object.keys(node)
console.log(key, lv)
for (let i = 0; i < node[key].length; i++) {
traverseNode(node[key][i], lv++)
}
}
}
您看这样可以不
---分割线---
之前明显得错误,(自己掌嘴)
let traverseNode = (node, lv = 1) => {
if (typeof node !== 'string') {
let key = Object.keys(node)
console.log(key, lv)
for (let i = 0; i < node[key].length; i++) {
traverseNode(node[key][i], lv + 1)
}
}
}
这样输出应该是符合题主意思的
把深度也当作参数传进去就行了
function traverseNode(tree, deep = 0) {
let ans;
for(let i in tree) if(tree.hasOwnProperty(i)) {
ans = i;
break;
}
console.log("节点值:" + ans + ",深度:" + deep);
if(tree[ans] instanceof Array) {
for(let i = 0; i < tree[ans].length; i++) {
traverseNode(tree[ans][i], deep + 1);
}
}
}
可以给 traverseNode
函数加个参数表示层级
let traverseNode = (node, level) => { // 增加个参数level表示当前node在第几层
if (typeof node !== 'string') {
let key = Object.keys(node)
console.log(key[0]+"==="+level);
for (let i = 0; i < node[key].length; i++) {
traverseNode(node[key][i], level+1);
}
}
}
traverseNode(treeObj, 1); // 假设从第一层开始