昨天遇到一道面试题,手写js将json数组转成tree对象,昨天写错了,今天特意想了下,思路其实挺简单,循环+递归,获取子节点对象。
javascript
let data = [
{'parent_id': 0, 'id': 1, 'value': 'XXX'},
{'parent_id': 1, 'id': 3, 'value': 'XXX'},
{'parent_id': 4, 'id': 6, 'value': 'XXX'},
{'parent_id': 3, 'id': 5, 'value': 'XXX'},
{'parent_id': 2, 'id': 4, 'value': 'XXX'},
{'parent_id': 1, 'id': 2, 'value': 'XXX'},
]
12345678
主要方法如下,使用的是es6语法
javascript
let toTree = (arr, key = 'id', pkey = 'pid', children='children') => {
if(arr.length === 0){
return {}
}
return getChildren(arr, 0) // 此处的0代表根节点,如有的根节点标识符为'#',那么此处则为'#'
// 主要原理是通过查找父节点parent_id为pid的对象,再一层一层往下查找子节点id,看是否存在parent_id等于id的对象
function getChildren(arr, pid) {
let temp = {}
arr.forEach(v => {
if(v[pkey] === pid){
temp[v[key]] = {} // 此处可根据相应需求作调整
if(Object.keys(getChildren(arr, v[key])).length !== 0){ // 如果存在子节点,此处也可将递归方法抽离出来,以减少代码量和操作
temp[v[key]][children] = getChildren(arr, v[key]) // 此处可根据相应需求作调整
}
}
})
return temp
}
}
1234567891011121314151617181920
测试数据
javascript
let tree = toTree(data)
console.log(JSON.stringify(tree))
// 结果为:
{
"1": {
"children": {
"2": {
"children": {
"4": {
"children": {
"6": {}
}
}
}
},
"3": {
"children": {
"5": {}
}
}
}
}
}
123456789101112131415161718192021222324
评论 (0)