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

由于应用页面较多,我们在通过区域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) 必须。函数,数组中的每个元素都会执行这个函数
函数参数:

参数 描述
currentValue 必须。当前元素的值
index 可选。当前元素的索引值
arr 可选。当前元素属于的数组对象
thisValue 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。
如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。

filter( )方法

语法

array.filter(function(currentValue,index,arr), thisValue)

参数说明

参数 描述
function(currentValue, index,arr) 必须。函数,数组中的每个元素都会执行这个函数
函数参数:

参数 描述
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)的更多相关文章

  1. for..of和for..in和map、filter等循环区别

    1.for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值. for in遍历比较适合遍历对象,不太适合数组,有可能遍历出来的不按照顺序 遍历数组 ,,,,,] for (var ...

  2. python3高阶函数:map(),reduce(),filter()的区别

    转载请注明出处:https://www.cnblogs.com/shapeL/p/9057152.html 1.map():遍历序列,对序列中每个元素进行操作,最终获取新的序列 print(list( ...

  3. lodash 集合处理方法 map和filter区别

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. Python:map()、reduce()、filter()的区别

    文章转于:https://blog.csdn.net/goupper1991/article/details/49803355 原文博主:https://blog.csdn.net/goupper19 ...

  5. forEach、map、filter、reduce的区别

    1.相同点: 都会循环遍历数组中的每一项: map().forEach()和filter()方法里每次执行匿名函数都支持3个参数,参数分别是:当前元素.当前元素的索引.当前元素所属的数组: 匿名函数中 ...

  6. 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. ...

  7. map和flatmap的区别+理解、学习与使用 Java 中的 Optional

    转自:map和flatmap的区别 对于stream,   两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...

  8. python的map,filter,reduce学习

    python2,python3中map,filter,reduce区别: 1,在python2 中,map,filter,reduce函数是直接输出结果. 2,在python3中做了些修改,输出前需要 ...

  9. 函数与函数式编程(生成器 && 列表解析 && map函数 && filter函数)-(四)

    在学习python的过程中,无意中看到了函数式编程.在了解的过程中,明白了函数与函数式的区别,函数式编程的几种方式. 函数定义:函数是逻辑结构化和过程化的一种编程方法. 过程定义:过程就是简单特殊没有 ...

随机推荐

  1. ECDSA高性能硬件实现——算法详解与模块划分

    ECDSA全称椭圆曲线数字签名算法,它是基于素数域的椭圆曲线对信息进行加签与验签.其核心在于对信息的加签,及对加签的信息进行验签,那么下面介绍该算法流程. 假设Alice希望对消息m进行签名,并将消息 ...

  2. 获取浏览器中url的参数

    例如: 浏览器的地址是:http://localhost:8080/src/views/moneyDetail?id=10 vue 获取浏览器的参数 获取id的参数:this.$route.query ...

  3. 方法对了,你做1年Android开发能顶别人做10年

    前几天后台有读者问我这样的问题.他在一家互联网公司工作3年了,每天都很忙,事情又多又杂. 本想着学习多一些东西也不是坏事,可到头来一无所获,什么都没学会,满腔的热情也被消磨得差不多. 三天两头动辞职的 ...

  4. Java 多线程与并发【原理第一部分笔记】

    Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...

  5. Java GC【笔记】

    Java GC(垃圾回收机制) (PS:篇幅很长的,样式都会重新整一下,比如使用二级) 首先我们得知道,一个对象被判定为垃圾的标准是什么? 对于Java对象来说,当不被其他的对象引用的时候,就可以看作 ...

  6. Vulnhub -- DC4靶机渗透

    用nmap扫描ip和端口,发现只开启了22ssh端口和80http端口 打开网页只有一个登录界面 目录爆破没有发现什么有用的,尝试对登录进行弱口令爆破 一开始使用burpsuite,使用一个小字典进行 ...

  7. HTML界的“苏炳添”——详解Canvas优越性能和实际应用

    Google Docs宣布将会把HTML迁移到基于Canvas渲染,这一消息的出现再次把几年前随HTML5诞生的标签重新推到了人们视线之中.Canvas在刚推出时主打的优势就是更快的渲染速度,堪称HT ...

  8. SQL 练习35

    查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩 方式1: SELECT Student.sid,Student.sname,t.score from Student , (SELEC ...

  9. 狂神说SpringBoot02:运行原理初探

    狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习. 微信公众号:狂神说(首发)    Bilibili:狂神说Java(视频) 未经作 ...

  10. 【java虚拟机】分代垃圾回收策略的基础概念

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6602166.html 一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一 ...