构造高性能树状结构(渲染、添加、修改、删除)

一、数据格式区别

1、数组对象形式

const treeData = [
 {    
  title:'0',
  key:'0',
  children[
   {    
    title:'0-0',
    key:'0-0',
    children:[
     {
      title:'0-0-0',
      key:'0-0-0',
     },
     {
      title:'0-0-1',
      key:'0-0-1'
     }
    ]
   }
  ]
 }
]

2、Map形式

const treeMapData = {
 root:{
  title:'0',
  childrenIdList:['0-0'],
  parentId:''
 },
 '0-0':{
  title:'0-0',
  childrenIdList:['0-0-0','0-0-1'],
  parentId:'0'
 },
 '0-0-0':{
  title:'0-0-0',
  childrenIdList:[],
  parentId:'0-0'
 },
 '0-0-1':{
  title:'0-0-1',
  childrenIdList:[],
  parentId:'0-0'
 }
}

二、渲染

拿到对应的item数据通过renderFn(item)来处理treeNode

1、数组对象形式

<ul>
 {treeData.map((item)=>{
   return <li>{renderFn(item)}</li>
 })}
</ul>

2、Map形式

<ul>
 {treeMapData['root'].childrenIdList.map((id)=>{
  const item = treeMapData[id]
  return <li>{renderFn(item)}</li>
 })}
</ul>

三、添加

* 在数组对象形式中我们需要递归遍历去找到父节点的方式去添加子节点,然后重新构造一个新的数组对象。

* Map形式中我们不需要递归遍历,结构也非常清晰。

treeMapData['0-0-2'] = {
 title:'0-0-2',
 childrenIdList:[],
 parentId:'0-0'
}


treeMapData['0-0'].childrenIdList.push('0-0-2')
const treeMapData = {
 root:{
  title:'0',
  childrenIdList:['0-0'],
  parentId:''
 },
 '0-0':{
  title:'0-0',
  childrenIdList:['0-0-0','0-0-1','0-0-2'],
  parentId:'0'
 },

 ...

 '0-0-2':{
  title:'0-0-2',
  childrenIdList:[],
  parentId:'0-0'
 }
}

四、修改

* 数组形式中 修改跟新增差不多 也是通过递归遍历找到对应的节点 进行修改节点数据,

* 在Map形式中 我们只需要拿到对应节点的id 直接进行修改。

treeMapData['0-0'].title = '0-0修改了'
const treeMapData = {
 root:{
  title:'0',
  childrenIdList:['0-0'],
  parentId:''
 },
 '0-0':{
  title:'0-0修改了',
  childrenIdList:['0-0-0','0-0-1','0-0-2'],
  parentId:'0'
 },

 ...
}

五、删除 

* 在数组对象形式中 我们需要删除一个节点的时候,还是很繁琐,先遍历再删除构造新的数组。

* 在Map形式中我们直接删除对应id的项,如果有父节点,我们可以在对应parentId项中的childrenIdList 然后移除对应的id。

const deleteItem = (id)=>{
 let pId = treeMapData[id].parentId
 if(pId){
  let newList = treeMapData[pId].childrenIdList.filter((item)=>item!=id)
  treeMapData[pId].childrenIdList = newList
 }    

 delete treeMapData[id]
}

deleteItem('0-0-1')
const treeMapData = {
 root:{
  title:'0',
  childrenIdList:['0-0'],
  parentId:''
 },
 '0-0':{
  title:'0-0修改了',
  childrenIdList:['0-0-0'],
  parentId:'0'
 },
 '0-0-0':{
  title:'0-0-0',
  childrenIdList:[],
  parentId:'0-0'
 },
}

总结

数组对象形式改成Map形式 结构清晰可以很轻易对数据进行处理,减少了递归遍历带来的性能消耗

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值