JS002. map( ) 和 filter( ) 的区别和实际应用场景(递归函数、深度优先搜索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,虽然是应急方法我也被自己恶心到了。为了痛彻前非,趁现在闲下来,我决定把这段代码改了。
当初不使用 map( ) 而使用 for···of 的第一个原因是 map( ) 有返回值,这个可以通过使用 filter( ) 来解决,第二个原因是 map ( ) 和 filter( ) 不能 break ,这个就很重要了。
我们生活中查字典时都是查到想要的就合上,没有终止语句的函数即使查到了想要的单词仍然会继续查完整本字典再合上,这无非大大增加了运算时间。
map( )方法
语法
array.map(function(currentValue,index,arr), thisValue)
参数说明
| 参数 | 描述 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数 函数参数:
|
||||||||
| thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。 |
filter( )方法
语法
array.filter(function(currentValue,index,arr), thisValue)
参数说明
| 参数 | 描述 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数 函数参数:
|
||||||||
| thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue ,"this" 的值为 "undefined" |
map( ) 和 filter( )的区别
map( ) 方法当条件不符合时仍会返回undefined,而 filter( ) 方法是返回一个新的数组,将符合条件的item推入这个数组。
但它们都有同一个缺点就是必需遍历完全才算执行结束,可以理解成它们是等同于数组长度个数的小的函数,break只能终止其中一个,所以是无法终止整个方法的。
由此可知,它们的应用场景跟VUE的computed计算属性相似,并且在数据量较为庞大时(不含非常庞大)执行效率大幅优于for循环,呈反抛物线方程轨迹
递归函数
在有规律的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),言简意骸就是有子查子,否则查兄弟,下图访问顺序应为: 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(' / ')
}
- END -
JS002. map( ) 和 filter( ) 的区别和实际应用场景(递归函数、深度优先搜索DFS)的更多相关文章
- for..of和for..in和map、filter等循环区别
1.for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值. for in遍历比较适合遍历对象,不太适合数组,有可能遍历出来的不按照顺序 遍历数组 ,,,,,] for (var ...
- python3高阶函数:map(),reduce(),filter()的区别
转载请注明出处:https://www.cnblogs.com/shapeL/p/9057152.html 1.map():遍历序列,对序列中每个元素进行操作,最终获取新的序列 print(list( ...
- lodash 集合处理方法 map和filter区别
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Python:map()、reduce()、filter()的区别
文章转于:https://blog.csdn.net/goupper1991/article/details/49803355 原文博主:https://blog.csdn.net/goupper19 ...
- forEach、map、filter、reduce的区别
1.相同点: 都会循环遍历数组中的每一项: map().forEach()和filter()方法里每次执行匿名函数都支持3个参数,参数分别是:当前元素.当前元素的索引.当前元素所属的数组: 匿名函数中 ...
- Spark RDD/Core 编程 API入门系列之map、filter、textFile、cache、对Job输出结果进行升和降序、union、groupByKey、join、reduce、lookup(一)
1.以本地模式实战map和filter 2.以集群模式实战textFile和cache 3.对Job输出结果进行升和降序 4.union 5.groupByKey 6.join 7.reduce 8. ...
- map和flatmap的区别+理解、学习与使用 Java 中的 Optional
转自:map和flatmap的区别 对于stream, 两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...
- python的map,filter,reduce学习
python2,python3中map,filter,reduce区别: 1,在python2 中,map,filter,reduce函数是直接输出结果. 2,在python3中做了些修改,输出前需要 ...
- 函数与函数式编程(生成器 && 列表解析 && map函数 && filter函数)-(四)
在学习python的过程中,无意中看到了函数式编程.在了解的过程中,明白了函数与函数式的区别,函数式编程的几种方式. 函数定义:函数是逻辑结构化和过程化的一种编程方法. 过程定义:过程就是简单特殊没有 ...
随机推荐
- 【问题记录】- 谷歌浏览器 Html生成PDF
起因: 由于项目需要实现将网页静默打印效果,那么直接使用浏览器打印功能无法达到静默打印效果. 浏览器打印都会弹出预览界面(如下图),无法达到静默打印. 解决方案: 谷歌浏览器提供了将html直接打印成 ...
- 探究Presto SQL引擎(1)-巧用Antlr
一.背景 自2014年大数据首次写入政府工作报告,大数据已经发展7年.大数据的类型也从交易数据延伸到交互数据与传感数据.数据规模也到达了PB级别. 大数据的规模大到对数据的获取.存储.管理.分析超出了 ...
- 基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器
前提 某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.com/byt ...
- 跟我一起写 Makefile(四)
书写规则 ---- 规则包含两个部分,一个是依赖关系,一个是生成目标的方法. 在Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出 ...
- Grid布局如何设置动画效果
CS代码 新增 GridLengthAnimation继承自AnimationTimeline public class GridLengthAnimation : AnimationTimeline ...
- VRRP协议原理与配置
一.VRRP协议概述 1.1.VRRP协议基本概念 局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络,如果此时默认网关设备发生故障,将中断所有用户终端的网络访问,这很可能会给用户带来不可预 ...
- PTA数据结构习题集
https://blog.csdn.net/qq_43733499/category_8956159.html https://www.cnblogs.com/nonlinearthink/tag/% ...
- GET请求与POST请求详解
一.GET请求 常用于获取服务器数据.常见的发起GET请求的方式有:url.href.src.form. 二.GET请求的格式 例子:index.php?userName=harry&pass ...
- DNS的正向解析与反向解析
DNS域名解析服务(Domain Name System)是用于解析域名与IP地址对应关系的服务,功能上可以实现正向解析与反向解析: 正向解析:根据主机名(域名)查找对应的IP地址. 反向解析:根据I ...
- redis和memecache有什么区别?
1.memcache所有值均是简单地字符串,redis有复杂的数据类型. 2.memcache不支持数据持久化,redis支持数据持久化. 3.redis速度比memcache快,redis构建了自己 ...