JS数组和树结构之间的转换

2020-04-02  本文已影响0人  夏海峰
第一道面试题

解答如下:

/**
 * 
 * @param {*} list 表示树状结构
 * @param {*} id 表示要查找的id
 * @param {*} superpath 递归时父节点的path路径
 */
function search(list, id, superpath) {
    // 遍历
    for(let i=0; i<list.length; i++) {
        // 给每个节点添加一个自定义属性 path,表示完整的路径
        list[i]['path'] = superpath ? superpath + '->' + list[i].id : list[i].id
        // 找到指定id节点时
        if (list[i].id === id) {
            return list[i].path
        }
        
        if (list[i].children && list[i].children.length > 0) {
            // 递归,第三个参数是父节点的path路径
            return search(list[i].children, id, list[i].path)
        }
    }
    // 如果找不到,返回 void
    return 'void'
}

测试一下:

let arr = [
    {
        id: 1,
        children: [
            { id: 2 },
            { id: 3, children: [
                { id: 4 },
                { id: 5 },
                { id: 6, children: [
                    { id: 7, children: [
                        { id: 8, children: [
                            { id: 9, children: []},
                            { id: 10, children: []}
                        ]}
                    ]}
                ]}
            ]}
        ]
    }
]

console.log(search(arr, 1))   // 1
console.log(search(arr, 3))   // 1->3
console.log(search(arr, 5))   // 1->3->5
console.log(search(arr, 7))   // 1->3->6->7
console.log(search(arr, 9))   // 1->3->6->7->8->9
console.log(search(arr, 11))   // void
第二道面试题

解答如下:

function transform(list, str) {
    list.map(ele=>{
        if (ele.length > 1) {
            str = str.replace(ele, '<em>'+ele+'</em>')
        }
        
    })
    return str
}

测试一下:

var arr = ['ad', 'b', 'ce']
var str = 'adsdbce'
console.log(transform(arr, str))   // <em>ad</em>sdb<em>ce</em>


--END--

上一篇 下一篇

猜你喜欢

热点阅读