javascript将json数组转成tree对象

偏向技术
/ 0 评论 / 40 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年03月30日,已超过1334天没有更新,若内容或图片失效,请留言反馈。

昨天遇到一道面试题,手写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

评论 (0)

取消