JS002. 浅写一个DFS递归函数查省市区

在开发过程中难免会碰到省市区级联的操作,一般后端人员是不愿意将中文储存在数据库的。

由于应用页面较多,我们在通过区域Code写查字典函数时应该注意函数的 时间复杂度空间复杂度

如果用三层for循环遍历省市区列表,很容易就把函数的复杂度堆上立方阶或者指数阶。

addressFilter(res) {
  var shippingAddress = []
  let province, city, area
  for (province of cityList) {
    if (res.provinceCode && res.provinceCode === province.code) {
      shippingAddress.push(province.name)
      for (city of province.children) {
        if (res.cityCode && res.cityCode === city.code) {
        shippingAddress.push(city.name)
          if (res.areaCode && res.areaCode) {
            for (area of city.children) {
              if (res.areaCode === area.code) {
                shippingAddress.push(area.name)
                break
                      }
            }
          } else break
          break
        }
      }
      break
    }
  }
  res.shippingAddress = shippingAddress.join(' / ')
  console.log('shippingAddress', res.shippingAddress)  // '输出: shippingddress福建省/厦门市/思明区'
  return res
}

u1s1,写这个方法的时候我是真的有恶心到。

使用  for···of  的第一个原因是 map 一定会有返回值,这个可以通过使用  filter  来解决。还有一个原因是 map 和 filter 需要特殊手段跳出,比如 throw new Error,这个就有点没必要了。

我们生活中查字典时都是查到想要的就合上,否则无疑大大增加了查字典的时间。

 

递归函数

在有规律的js事件中,可以使用递归函数通过动态改变函数的实参调用本身,就可以对结构相同的树结构进行同样的处理,亦或是如以下代码这样遍历查询想要的结果。

searchAddress(codeArr){
  var res = []

  function item(codeArr,cityJson){
    if(codeArr.length){
      const a = cityJson.filter(item=>{
        return item.code === codeArr[0]
      })
      console.log('searchAddress',a)
      res.push(a[0].name)
      codeArr.shift()
      if(codeArr.length){
        item(codeArr,a[0].children)
      }
    }
  }
  item(codeArr, cityList)
  console.log('xxxxxxxxxxxxxres:' ,res)
  return res
},

 

深度优先搜索(DFS & 递归)

深度优先搜索(DFS),相信科班的hxd们熟的不能再熟了,言简意骸就是有子查子,否则查兄弟,下图访问顺序应为: A  →  →  →  →  →  →  →  →  →  。

  • 如果条件相匹配,将它的子树传给函数做实参再执行递归函数
  • 如果条件不匹配,通过索引拿到它的下一个兄弟结点,再次执行

下面我们来改造函数:

/* 递归省市区json */
addressFun(inputArr) {   var outputArr = []   let index = 0   let status = false   function dfs(node) {     if(status) {       index = 0       status = !status     }     if (node[index] && node[index].code === inputArr[0]) {       outputArr.push(node[index].name)       status = !status       inputArr.shift()       if(inputArr.length) {         dfs(node[index].children)       } else {         return       }     } else if (node[index]) {       index++       dfs(node)     } else {       return     }   }   dfs(cityList)   return outputArr.join(' / ') }

- END -

posted @ 2021-03-26 10:46  97z4moon  阅读(318)  评论(0)    收藏  举报
Title