前端常见算法

151 阅读1分钟

1.一维数组转换成树形结构

数组示例:

var data = 
[
  { pId: 0, id: 1, value: "1" },
  { pId: 0, id: 3, value: "2" },
  { pId: 3, id: 7, value: "3" },
  { pId:7, id: 10, value: "4" }
]

一、递归解法,不推荐使用(数组大的时候容易爆栈) 可以深度遍历,也可以广度遍历

二、利用引用类型,循环一遍就组装好tree

image.png

function setNode(idsMap, id){
  let node
  if(!idsMap[id]){
      idsMap[id] = node = {id: id,  children: []}
    }else{
      node = idsMap[id]    
    }
  return node
}
function convertArrayToTree(arr){
  const idsMap = {},results = []
  data.forEach(item=>{
    let node, parentNode
    node = setNode(idsMap, item.id)
    if(item.pId === 0){
      //如果是一级节点,就push到results数组中
      results.push(node)
    }else{
      //在idsMap中寻找当前节点的parent节点,找到后把当前节点push到children中
      //因为是引用地址关系,这样就形成了一个树状的引用关系,当一次循环遍历结束后,这个树状结构就已经生成了
      parenNode = setNode(idsMap, item.pId)
      parenNode.children?.push(node) 
    }  
  })
  return results
}

console.log(convertArrayToTree(data))

2.根据文件内容生成hash串
3.搜索最优匹配排序 例如: 选项有['dddddtest', 'atest', 'cctest', 'test'], 搜索test,应出现
[ 'test','atest', 'cctest', 'dddddtest']

const List
    .filter(item => {
      return item.toLocaleLowerCase().includes(searchVal)
    })
    .map(i => [
      i.toLocaleLowerCase().indexOf(searchVal),
      i
    ])
    .sort(([a], [b]) => a - b)
    .map(([, i]) => i)

4.树的查找