🚀大厂手写高频考点:数组转树,树转对象
前言
最近面大厂过程中,发现这类手写题型有点没归纳以及复习好,这次再补充补充。
这类题目我把它定义为二线手写题,毕竟肯定没有我们常见的手写防抖节流
,promise.all
,发布订阅
常见。所以屏幕前的友友也最好去把一些更高频的手写题掌握了再了解这篇文章会性价比高一点~
数组转树
它的原始数据往往是这样的
let data = [
{ id: 0, parentId: null, name: '生物' },
{ id: 1, parentId: 0, name: '动物' },
{ id: 2, parentId: 0, name: '植物' },
{ id: 3, parentId: 0, name: '微生物' },
{ id: 4, parentId: 1, name: '哺乳动物' },
{ id: 5, parentId: 1, name: '卵生动物' },
{ id: 6, parentId: 2, name: '种子植物' },
{ id: 7, parentId: 2, name: '蕨类植物' },
{ id: 8, parentId: 4, name: '大象' },
{ id: 9, parentId: 4, name: '海豚' },
{ id: 10, parentId: 4, name: '猩猩' },
{ id: 11, parentId: 5, name: '蟒蛇' },
{ id: 12, parentId: 5, name: '麻雀' }
]
然后需要你根据其parentId
给它形成一个树状结果
function transTree(data) {
let result = []
let map = {}
if (!Array.isArray(data)) {
// 首先判断传进来的这个参数是不是一个数组
return [] //不是直接返回
}
data.forEach(item => {
// 然后再次遍历数组中的每一项,让每一项的ID值作为map对象的键
map[item.id] = item
})
data.forEach(item => {
// 找到item的上一级
let parent = map[item.parentId]
if (parent) {
// 判断当前parent有没有children属性有的话就把item加进去,没有就先初始化再加进去
if (parent.children) {
parent.children.push(item)
} else {
parent.children = [item]
}
} else {
// 如果他没有父亲就把他加入到我们首次声明的数组里
result.push(item) //item是对象的引用
}
})
return result //数组里的对象和data是共享的
}
console.log(transTree(data))
结果:
也没有很难不是嘛,如果第一遍看不懂,那就试着自己摸索一下,再不行就第二遍第三遍,反正难度也就一般的,多花一点点时间肯定没事的。
树转数组
它的数据往往是这样的
const array = [
{
code: 101,
name: '北京',
},
{
code: 102,
name: '石家庄',
},
{
code: 102,
name: '江苏',
children: [{
code: 102,
name: '南京',
}, {
code: 102,
name: '连云港',
}]
}
]
function toObj(arr) {
let obj = {};
for (let item of arr) {
// 若对象有children属性,则递归遍历
if (item['children'] !== undefined) {
obj = { ...toObj(item['children']),...obj };
} else {
// 没有children属性,则直接进行拷贝
obj[item.name] = item;
}
}
return obj;
}
可以看到,这里的写法其实很像深拷贝的写法,就是通过递归遍历获取最里面的值。
结果
转载自:https://juejin.cn/post/7243715280763928613