数组转换成树

数组转换成树

// 完成版
function getTreeData(oriCode, oriData) {
    let result = []
    for (let obj of oriData) {
        if (obj.facode === oriCode) {
            obj.children = getTreeData(obj.code, oriData)
            result.push(obj)
        }
    }
    return result
}
// 初步1——数组转换成树
function generateOptions(params){
  var result=[]
  for(let param of params){
    if(param.facode==0){
      var parent = {
        code:param.code,
        facode:param.facode,
      }
      parent.children = getchilds(param.code,params);
      result.push(parent)
    }
  }
  return result
};

function getchilds(code,array){
  let childs = new Array()
    for(let arr of array){
      if(arr.facode == code){
        childs.push({
          code:arr.code,
          facode:arr.facode
        })
      }
    }
    for (let child of childs){
      let childscopy = getchilds(child.code,array);
      if(childscopy.length>0){
        child.children = childscopy
      }
    }
  return childs
}
// 初步2——数组转换成树
function getTree(params){
  var result=[]
  var parent = {code:"0",facode:""}
  parent.children = getchilds(parent.code,params);
  result.push(parent)
  return result
};

function getchilds(array,code){
  let childs = new Array()
    for(let arr of array){
      if(arr.facode == code){
        childs.push({ ...arr })
      }
    }
    for (let child of childs){
      let childscopy = getchilds(array,child.code);
      if(childscopy.length>0){
        child.children = childscopy
      }
    }
  return childs
};
// 初步3——数组转换成树
function getTree(data){
  var result = [];
  var codeList = [];
  data.forEach(item => {
    codeList.push(item.code)
  });
  for(let arr of data){
    if(arr.facode==""){
      var parent = {...arr} 
      parent.children = getchilds(data,arr.code)
      result.push(parent)
    }else{
      const a = codeList.indexOf(arr.facode)
      if(a==-1){
        var parent = {...arr} 
        parent.children = getchilds(data,arr.code)
        result.push(parent)
      }
    }
  }
  return result
}

function getchilds(array,code){
  let childs = new Array()
    for(let arr of array){
      if(arr.facode == code){
        childs.push({ ...arr })
      }
    }
    for (let child of childs){
      let childscopy = getchilds(array,child.code);
      if(childscopy.length>0){
        child.children = childscopy
      }
    }
  return childs
};
// 初步4——数组转换成树
function getTree(data){
  var result = [];
  var codeList = [];
  data.forEach(item => {
    codeList.push(item.code)
  });
  for(let arr of data){
    const index = codeList.indexOf(arr.facode)
    const child =[]
    data.forEach(item=>{ 
      if(item.facode==arr.code){ child.push(item) }
    })
    if(index==-1){
      var parent = {...arr} 
      parent.children = child
      result.push(parent)
    }else{
      arr.children = child
    }
  }
  return result
}
// 初步5——数组转换成树
function getTree(data,code){
  var result = [];
  for(let arr of data){
    const child =[]
    data.forEach(item=>{ 
      if(item.facode==arr.code){ child.push(item) }
    })
    if(arr.facode == code){
      var parent = {...arr}
      parent.children = child
      result.push(parent)
    }else{
      arr.children = child
    }
  }
  return result
}

树转换成数组

let result = []
  function getOri(params){
    for(const data of params){
      result.push({
        code:data.code,
        facode:data.facode,
      })
      data.children && getOri(data.children)
    }
    return result 
  }
  const ori=getOri(treeData)

遍历树

深度优先遍历

先序遍历
function DFS(params,func){
  params.forEach(data=>{
    func(data)
    data.children&&DFS(data.children,func)
  })
}
function DFS(params,func){
  for(const data of params){
    func(data)
    data.children && DFS(data.children,func)
  }
}
后序遍历
function DFS(params,func){
  params.forEach(data=>{
    data.children && DFS(data.children,func)
    func(data)
  })
}
DFS(treeData,node=>{
  console.log(node)
})
// 初步1——深度优先遍历 
function DFS(params){
  for(let i in params){
    if(params[i].children){
      DFS(params[i].children)
    }
  }
}

广度优先遍历

function BFS(params,func){
  let node,list = [...params]
  while (node = list.shift()){
    func(node)
    node.children && list.push(...node.children)
  }
}
BFS(treeData,node=>{
  console.log(node)
})

树的查找

// 完成版
function treeFind (params, func) {
  var res
  for (const data of params) {
    if (func(data)) {
      res = data
      break;
    } 
    if(data.children){
      const resCopy = treeFind(data.children,func)
      if(resCopy){
        res = resCopy
        break;
      }
    }
  }
  return res
}
// 初步1——树的查找
function treeFind (tree, func) {
  for (const data of tree) {
    if (func(data)) return data
    if (data.children) {
      const res = treeFind(data.children, func)
      if (res) return res
    }
  }
  return null
}
const data=treeFind(treeData,node=>node.facode=="0")
console.log(data)

树的过滤

// 完成版
function treeFilter(params,func){
  const arr = []
  for (let data of params){
    if(func(data)){
      arr.push(data)
      if(data.children){
        data.children=treeFilter(data.children,func)
        if(data.children.length==0){
          delete data.children
        }
      }
    }
  }
  return arr
}
const dataFilter=treeFilter(treeData,node=>node.code.includes('4'))
// 树的过滤(方法一:不推荐)
function treeFilter(params,func){
  const arr = []
  for (const data of params) {
    if(func(data)){
      var parent = {
        code:data.code,
        facode:data.facode,
      }
      if(data.children){
        if(data.children.length!==0){
          parent.children = treeFilter(data.children,func);
        }
      }
      arr.push(parent)
    }
  }
  return arr
}
const dataFilter=treeFilter(treeData,node=>node.code.includes('4'))

树的添加

function add(params){
  if(params.facode=="0"){
    treeData.push(params)
  }else{
    //否则寻找父级节点
    treeFind(treeData,node=>node.code==params.facode).children.push(params)
  }
}
add(cs)

// 树的添加(另一种树):

function add(params){
  treeFind(treeData,node=>node.code==params.facode).children.push(params)
}

树的修改

// 完成版
function editData(params){
  treeFind(treeData,node=>node.code==params.code).facode = params.facode
  //重新生成树
  //树转数组
  let result = []
  function getOri(params){
    for(const data of params){
      result.push({ ...data })
      data.children && getOri(data.children)
    }
    return result 
  }
  const ori=getOri(treeData)
  const treeData1 = getTree(ori,"0")
  return treeData1
}
const dataEdit = editData(cs2)
// 初步1——树的修改(内容修改)
function editData(params){
  if(params.facode=="0"){
    let index = treeData.indexOf(params.code)
    treeData.splice(index,1)
  }else{
    let del = treeFind(treeData,node=>node.code==params.facode).children
    // let index = del.map(x=>x.code).indexOf(params.code)
    let index = del.findIndex(x=>x.code===params.code)
    del.splice(index,1,params)
  }
}
editData(cs3)
// 初步2——树的修改(包括父级修改)
function editFa(params){
  if(params.facode=="0"){
    let index = treeData.findIndex(x=>x.code===params.code)
    if(index == -1){
      //推进并删除原先位置
      let del = treeFind(treeData,node=>node.code==params.code)
      let delFa = treeFind(treeData,node=>node.code==del.facode).children
      let index = delFa.findIndex(x=>x.code===params.code)
      delFa.splice(index,1)
      treeData.push(params)
    }else{
      //替代
      treeData.splice(index,1,params)
    }
  }else{
    let del = treeFind(treeData,node=>node.code==params.facode).children
    let index = del.findIndex(x=>x.code===params.code)
    if(index== -1){
      //删除原先并推进
      let del1 = treeFind(treeData,node=>node.code==params.code)
      if(del1.facode=="0"){
        let index = treeData.findIndex(x=>x.code===params.code)
        treeData.splice(index,1)
      }else{
        let delFa = treeFind(treeData,node=>node.code==del1.facode).children
        let index = delFa.findIndex(x=>x.code===params.code)
        delFa.splice(index,1)
      }
      del.push(params)
    }else{
      del.children.splice(index,1,params)
    }
  }
}
editFa(cs4)
// 初步3——树的修改(修改父级)
function editData(params){
  const editdata = treeFind(treeData,node=>node.code==params.code)
  editdata.facode = params.facode
  //重新生成树
  //树转数组
  let result = []
  function getOri(params){
    for(const data of params){
      result.push({
        code:data.code,
        facode:data.facode,
      })
      data.children && getOri(data.children)
    }
    return result 
  }
  const ori=getOri(treeData)
  const treeData1 = getTree(ori)
  return treeData1
}
const dataEdit = editData(cs4)

树的删除

// 完成版
function deleteData(params,code){
  if(params.facode==code){
    let index = treeData.findIndex(x=>x.code===params.code)
    treeData.splice(index,1)
  }else{
    let del = treeFind(treeData,node=>node.code==params.facode).children
    let index = del.findIndex(x=>x.code===params.code)
    del.splice(index,1)
  }
}
// 初步1——树的删除
function deleteData(params){
  let del = treeFind(treeData,node=>node.code==params.facode).children
  let index = del.findIndex(x=>x.code===params.code)
  del.splice(index,1)
}
deleteData(cs)

致我实习那段灰暗的日子

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值