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--