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 → B → C → D → E → H → I → J → F → G 。

- 如果条件相匹配,将它的子树传给函数做实参再执行递归函数
 
- 如果条件不匹配,通过索引拿到它的下一个兄弟结点,再次执行
 
下面我们来改造函数:
/* 递归省市区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(' / ') }

                
            
        
浙公网安备 33010602011771号