精华内容
下载资源
问答
  • 在 JavaScript 中使用循环时,需要理解两个关键点:可枚举的属性和可迭代的对象。可枚举的属性可枚举对象的一个定义特征是,当通过赋值操作符向对象分配属性时,我们将内部 enumerable 标志设置为true,这是默认值。...

    在 JavaScript 中使用循环时,需要理解两个关键点:可枚举的属性可迭代的对象

    可枚举的属性

    可枚举对象的一个定义特征是,当通过赋值操作符向对象分配属性时,我们将内部 enumerable 标志设置为true,这是默认值。

    当然,我们可以通过将其设置为false来更改此行为。

    要点:可枚举的属性都可以用for...in 遍历出来。

    举个例子看看:


    // 会出现在 for ... in 循环中
    const gbols = {};
    gbols.platform = "LogRocket";

    Object.getOwnPropertyDescriptor(gbols, "platform");

    // {value: "LogRocket", writable: true, enumerable: true, configurable: true}

    for (const item in gbols) {
       console.log(item)
    }
    // platform


    // 不会出现在 for ... in 循环中
    // 将 enumerable 设置为 false
    Object.defineProperty(gbols, 'role', {value: 'Admin', writable: true, enumerable: false})

    for (const item in gbols) {
      console.log(item)
    }
    // platform

    可迭代的对象

    如果一个对象定义了它的迭代行为,那么它就是可迭代的。在这种情况下,将在for …of构造中循环的值将定义其迭代行为。可迭代的内置类型包括ArraysStringsSetsMapsobject 是不可迭代的,因为它没有指定@iterator method

    在Javascript中,所有可迭代都是可枚举的,但不是所有的可枚举都是可迭代的。

    for …in在数据中查找对象,而for ..of查找重复序列。来个例子看看:

    const authors = ['小智''小王''小明''小红'];

    // 与 for in 循环一起使用
    fro (const author in authors) {
      console.log(author)
    }

    // 打印: 0,1,2,3

    for (const author of authors) {
      console.log(author)
    }

    // 打印:小智  小王  小明   小红

    使用此构造时,需要牢记的是,如果调用了 typeof 得到的类型是 object,则可以使用for…in循环。

    我们来看一下对authors变量的操作:

    typeof authors

    // 打印的是 “object”,因此我们可以使用`for ..in`

    乍一看感觉有点奇怪,但必须注意,数组是一种特殊的对象,它以索引为键。for ...in循环找到对象时,它将循环遍历每个键。

    for …in 遍历 authors 数组的方式可以用下面显式化的方式来理解:

    const authors = {
      0: 'Jade',
      1: 'Dafe',
      2: 'Gbols',
      3: 'Daniel'
    }

    重要说明:如果可以追溯到对象(或从对象原型链继承它),因为for …in将以不特定的顺序遍历键。

    同时,如果实现 for.. of 构造的迭代器,则它将在每次迭代中循环遍历该值。

    ForEach 和 map 方法

    尽管可以使用forEachmap方法来实现相同的目标,但是它们的行为和性能方面存在差异。

    基础层面上,当函数被调用时,它们都接收一个回调函数作为参数。

    考虑下面的代码片段:

    const scoresEach = [2,4 ,8, 16, 32];
    const scoresMap = [2,4 ,8, 16, 32];
    const square = (num) => num * num;

    我们逐一列出其操作上的一些差异。

    forEach返回undefined,而map返回一个新数组:

    let newScores = []
    const resultWithEach = scoresEach.forEach((score) => {
    const newScore = square(score);
    newScores.push(newScore);
    });
    const resultWithMap = scoresMap.map(square);

    console.log(resultWithEach) // undefined
    console.log(resultWithMap) // [4, 16, 64, 256, 1024]

    map是一个纯函数,而forEach则执行一些更改:

    console.log(newScores) // [4, 16, 64, 256, 1024]

    在我看来,map倾向于函数式编程范例。与forEach不同的是,我们并不总是需要执行一次更改来获得想要的结果,在forEach中,我们需要对newscore变量进行更改。在每次运行时,当提供相同的输入时,map函数将产生相同的结果。同时,forEach对应项将从最后一次更改的前一个值中获取数据。

    链式

    map可以使用链式操作,因为map返回的结果是一个数组。因此,可以立即对结果调用任何其他数组方法。换句话说,我们可以调用filter, reduce, some等等。对于forEach,这是不可能的,因为返回的值是undefined

    性能

    map 方法的性能往往优于forEach方法。

    检查用mapforEach实现的等效代码块的性能。平均而言,map函数的执行速度至少要快50%

    注意:此基准测试取决于你使用的计算机以及浏览器的实现。

    总结

    在上面讨论的所有循环结构中,为我们提供最多控制的是for..of的循环。我们可以将它与关键字returncontinuebreak一起使用。这意味着我们可以指定我们希望对数组中的每个元素发生什么,以及我们是想早点离开还是跳过。


    作者:Gbolahan Olagunju  译者:前端小智  来源:blog

    原文:https://medium.com/better-programming/22-miraculous-tools-for-react-developers-in-2019-7d72054e2306

    如果你觉得这篇内容对你挺有启发,邀请你帮我三个小忙:

    点个「在看」,让更多的人也能看到这篇内容

    欢迎关注我的3500+sta文章合集https://github.com/qq449245884/xiaozhi,希望可以带给你点启发!

    想进前端交流群一起探讨技术,请在后台回复「1」或者加微信qq449245884

    1d522870b89357f6c10e7a11f74ec3b6.png

    展开全文
  • 遍历Map

    2012-11-22 11:09:12
    遍历Map主要用到Map两个方法,   1、map.keySet():获取map的key的一个集合   2、map.entrySet():获取Map.Entry<Object, Object> 键值对的集合   用以前两种方法取得Set集合, 再用...

    遍历Map主要用到Map的两个方法,

     

    1、map.keySet():获取map的key的一个集合

     

    2、map.entrySet():获取Map.Entry<Object, Object> 键值对的集合

     

    用以前两种方法取得Set集合, 再用Iterator,或者for循环 遍历map

     

    代码如下:

    Map<String, String> map = new HashMap<String, String>();
    map.put("key1", "1");
    map.put("key2", "2");
    map.put("key3", "3");
    //方法一:获取key的集合,再用Iterator
    Iterator<String> iter = map.keySet().iterator();
    while(iter.hasNext()) {
    	String key = iter.next();
    	System.out.println(key + ": " + map.get(key));
    }
    //方法二:获取key的集合,再用for循环
    for(String key : map.keySet()) {
    	System.out.println(key + ": " + map.get(key));
    }
    
    //方法三:获取Map.Entry的集合,再用Iterator
    Iterator<Map.Entry<String, String>> iter2 = map.entrySet().iterator();
    while(iter2.hasNext()) {
    	Map.Entry<String, String> entry  = iter2.next();
    	System.out.println(entry.getKey() + ": " + entry.getValue());
    }
    
    //方法三:获取Map.Entry的集合,再用for循环
    for(Map.Entry<String, String> entry : map.entrySet()) {
    	System.out.println(entry.getKey() + ": " + entry.getValue());
    }

     

    展开全文
  • 关于JS循环遍历的汇总

    千次阅读 2017-03-12 11:14:16
    关于JS循环遍历写下这篇文章的目的,主要是想总结一下关于JS对于集合对象遍历的方式方法,以及在实际应用场景中怎样去使用它们。本文会主要介绍:while,for,forEach,every,some,filter,reduce,map,indexOf…while/do...

    关于JS循环遍历

    写下这篇文章的目的,主要是想总结一下关于JS对于集合对象遍历的方式方法,以及在实际应用场景中怎样去使用它们。本文会主要介绍:while,for,forEach,every,some,filter,reduce,map,indexOf…

    while/do while

    while、do while主要的功能是,当满足while后边所跟的条件时,来执行相关业务。这两个的区别是,while会先判断是否满足条件,然后再去执行花括号里面的任务,而do while则是先执行一次花括号中的任务,再去执行while条件,判断下次还是否再去执行do里面的操作。也就是说 do while至少会执行一次操作,生产中这个就可能用的比较少了,因为他与接下来要讲的for循环相比,个人觉得可读性上差了一点。

    while(条件){
    执行...
    }
    ------------
    do{
    执行...
    }
    while(条件)

    for

    for (语句 1; 语句 2; 语句 3)
      {
      被执行的代码块
      }
    • 语句 1 在循环(代码块)开始前执行
    • 语句 2 定义运行循环(代码块)的条件
    • 语句 3 在循环(代码块)已被执行之后执行

    这个就不赘述了,也比较好理解,主要聊一下for…in/for…of这两个东西。

    for…in

    for…in的作用主要是去遍历对象的可枚举属性。即

     var foo = {
                    name: 'bar',
                    sex: 'male'
                }
                Object.defineProperty(foo, "age", { value : 18})
                for(var a in foo){
                    console.log(`可枚举属性:${a}`)
                }
                console.log(`age属性:${foo.age}`)

    因为Object.defineProperty,建立的属性,默认不可枚举,因此在浏览器中打印的结果为:
    for...in
    在JS当中,数组也算作对象,但一般不推荐把for…in用在数组遍历上面,如果for…in普通数组的话,a返回数组的索引。

    for…of

    for…of是ES6新增的方法,主要作用是用来遍历具有iterator接口的数据集合,除了ES5的Array,还有ES6新增的Map,Set等,但是for…of不能去遍历普通的对象(普通对象不具备iterator接口),如果想去遍历普通对象,可以使用generator函数去给普通对象先生成iterator接口。for…of的好处是可以使用break跳出循环。

    every/some

    返回一个布尔值。当我们需要判定数组中的元素是否满足某些条件时,可以使用every/some。这两个的区别是,every会去判断判断数组中的每一项,而some则是当某一项满足条件时返回。例如:

    let foo=[5,1,3,7,4].every(function (item,index) {
                    console.log(`索引:${index},数值:${item}`)
                    return item>2
                })
                console.log(foo)

    打印结果为:
    every
    当第二项不满足条件式跳出循环,返回false。

    let foo=[5,1,3,7,4].some(function (item,index) {
                    console.log(`索引:${index},数值:${item}`)
                    return item>2
                })
                console.log(foo)

    打印结果为:
    some
    当数组的某项满足条件时跳出循环,返回true.
    在按照约定条件筛选数组时,every/some是非常方便的方法。

    filter

    筛选出一个满足相关条件的新数组。

    let foo=[5,1,3,7,4].filter(function (item,index) {
                    console.log(`索引:${index},数值:${item}`)
                    return item>2
                })
                console.log(foo)

    filter
    将满足返回值条件的item组成一个新的数组。过滤器,顾名思义,比较好理解。在按照约定条件筛选数组元素时,filter比较方便。filter() 不会改变原始数组。

    map

    let foo=[5,1,3,7,4].map(function (item,index) {
                    console.log(`索引:${index},数值:${item}`)
                    return item+2
                })
                console.log(foo)

    map
    返回一个将每个元素进行“二次加工”的新数组,map与filter都是返回一个新的数组,区别则是filter是将原数组,通过相关条件筛选出合法的item,来组成一个新的数组,而map则是将每个item通过再加工来返回一个新的数组。

    reduce

    将数组元素做“叠加”处理,返回一个值。

    let foo=[5,1,3,7,4].reduce(function (pre,cur) {
                    console.log(`索引:${pre},数值:${cur}`)
                    return pre+cur
                })
                console.log(foo)

    打印结果为:
    reduce
    pre为累加值,cur为当前值。reduce函数值得注意的是,reduce(fn,init)第二个参数,可以传一个初始值,如果代码改成这样:

    let foo=[5,1,3,7,4].reduce(function (pre,cur) {
                    console.log(`索引:${pre},数值:${cur}`)
                    return pre+cur
                },'')
                console.log(foo)

    则为:
    reduce

    indexOf

    返回指定字符串首次出现的位置

     let foo=['57','17','37','7','4'].indexOf('7')
                console.log(foo)

    indexOf
    这个函数比较常用的应用场景是,在做if判断时,可以代替||,&&等关系符。比如:
    &&
    可以代替
    if(value==’next’||value==’pre’)的这种写法,当判断元素较多时,这种写法比较划算。

    总结

    个人非常喜欢filter/map/reduce,但是看到身边的同学一言不合就foreach,替这三个函数心疼几秒。。。不过低版本浏览器也确实不支持这些函数。。。根据自己需要去选择合适的遍历方式可以大大提升效率。哦耶

    展开全文
  • 使用迭代器 遍历ArrayList,遍历 Map

    千次阅读 2019-07-08 20:15:53
    一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator接口或ListIterator接口。 迭代器,使你能够通过循环来得到或...

    通常情况下,你会希望遍历一个集合中的元素。例如,显示集合中的每个元素。

    一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator接口或ListIterator接口。

    迭代器,使你能够通过循环来得到或删除集合的元素。ListIterator 继承了Iterator,以允许双向遍历列表和修改元素。

    序号 迭代器方法描述
    1 使用 Java Iterator
    这里通过实例列出Iterator和listIterator接口提供的所有方法。

    遍历 ArrayList

    import java.util.*;
     
    public class Test{
     public static void main(String[] args) {
         List<String> list=new ArrayList<String>();
         list.add("Hello");
         list.add("World");
         list.add("HAHAHAHA");
         //第一种遍历方法使用foreach遍历List
         for (String str : list) {            //也可以改写for(int i=0;i<list.size();i++)这种形式
            System.out.println(str);
         }
     
         //第二种遍历,把链表变为数组相关的内容进行遍历
         String[] strArray=new String[list.size()];
         list.toArray(strArray);
         for(int i=0;i<strArray.length;i++) //这里也可以改写为  foreach(String str:strArray)这种形式
         {
            System.out.println(strArray[i]);
         }
         
        //第三种遍历 使用迭代器进行相关遍历
         
         Iterator<String> ite=list.iterator();
         while(ite.hasNext())//判断下一个元素之后有值
         {
             System.out.println(ite.next());
         }
     }
    }

    解析:

    三种方法都是用来遍历ArrayList集合,第三种方法是采用迭代器的方法,该方法可以不用担心在遍历的过程中会超出集合的长度。

     

    遍历 Map

    import java.util.*;
     
    public class Test{
         public static void main(String[] args) {
          Map<String, String> map = new HashMap<String, String>();
          map.put("1", "value1");
          map.put("2", "value2");
          map.put("3", "value3");
          
          //第一种:普遍使用,二次取值
          System.out.println("通过Map.keySet遍历key和value:");
          for (String key : map.keySet()) {
           System.out.println("key= "+ key + " and value= " + map.get(key));
          }
          
          //第二种
          System.out.println("通过Map.entrySet使用iterator遍历key和value:");
          Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
          while (it.hasNext()) {
           Map.Entry<String, String> entry = it.next();
           System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
          }
          
          //第三种:推荐,尤其是容量大时
          System.out.println("通过Map.entrySet遍历key和value");
          for (Map.Entry<String, String> entry : map.entrySet()) {
           System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
          }
        
          //第四种
          System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
          for (String v : map.values()) {
           System.out.println("value= " + v);
          }
         }
    }
    

    如何使用比较器

    TreeSet和TreeMap的按照排序顺序来存储元素. 然而,这是通过比较器来精确定义按照什么样的排序顺序。

    这个接口可以让我们以不同的方式来排序一个集合。

    序号 比较器方法描述
    1 使用 Java Comparator
    这里通过实例列出Comparator接口提供的所有方法

    总结

    Java集合框架为程序员提供了预先包装的数据结构和算法来操纵他们。

    集合是一个对象,可容纳其他对象的引用。集合接口声明对每一种类型的集合可以执行的操作。

    集合框架的类和接口均在java.util包中。

    任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。

    节选自https://www.runoob.com/java/java-collections.html

    展开全文
  • * 1、循环 for (普通 for 循环 和 增强版 for 循环) * 2、迭代器 Iterator 进行遍历 */ 迭代器的使用方式: 迭代器(Iterator) 进行遍历: hasNext() 1、判断是否存在下一元素 true/false 2、如果有,指针后移 ...
  • JS 语句遍历顾名思义是使用js的循环语句,例如 for循环语句,for...in语句等等;数组API遍历则是使用数组的API方法进行遍历。数组APIES5为数组定义了5个迭代方法,每个方法都接受两个参数:要在每一项上运行的函数和...
  • Map集合的遍历思路 第一种思路 获取Map集合中的所有键,放在一Set集合中,遍历该Set集合,获取到每一键,根据键值...增强for循环 拿到每一键后,获取对应的值 V get(K key) 代码示例: import java.ut...
  • 对数组进行遍历的方法,还包括了forEach 以及map,这种方法的参数相同,区别就是map 返回操作后的值,返回一新数组,forEach返回undefined let string = 'abcde' for(let i=0;i<string.length;i+...
  • 不使用for遍历进行,叠加(递归,ES5实现) 实现addNum(num1, num2)方法, 接受两个参数, 分别是两个整数,求两个整数之间的所有整数之和 ​ 例如: addNum(10, 20...不要使用for循环 法一: 使用递归 function addNu...
  • 一、JavaScript概述 JavaScript(简称JS)是当今互联网上最流行的脚本...JavaScript 与 Java无关, 是种完全不同的语言 JavaScript的版本: 1997年,ECMAScript 1,是JavaScript的第一版本 1998年,ECMAScript 2...
  • 元素在内存中的种存放方式 一种是顺序存放,内存地址是连续的。顺序存放的集合一般会实现RandomAccess接口,表示此集合中的元素可以随即存取。读取一元素的时间复杂度...for循环遍历基于计数器,根据集合中元素...
  • ``` int main() { multimap, string> m{ ...2.为什么在for循环遍历中可以使用author.second,却不能使用order_m.second,编译器会提示order_m并没有元素second,可是author不是只是order_m的别名而已吗?
  • javascript中遍历数组的方式有很多,今天我提一下 两个原生的遍历方法,forEach和map 代码如下: 遍历一个数组[1,2,3,4,5,6,7,8,9],然后将这些元素打印出来,这个没问题,但是我想如果要打断程序运行,提前退出...
  • 1.第一种 使用for循环遍历数组, 首先定义一空数组,一空对象,把需要使用到的变量添加到空对象bb中,然后尾部添加到空数组aa中, 接下来 令 value 等于 aa 就可以了 2.第二种使用es6的 map方法 遍历数组 , ...
  • ​ 一般遍历数组都会选择for或者增强for,这两个方法其实也可以用在集合框架之中;还有一种方法是可以采用迭代器遍历集合框架,它是一个对象,实现了 Iterator 接口或者是 ListIterator 接口。使用迭代器,你可以...
  • 集合的遍历

    2015-08-17 15:49:38
    而集合的遍历通常有遍历方式,除了可以用高级for循环之外,还有它们自己独特的遍历方式:器迭代迭代!迭代器是Collection集合的一种特殊的遍历方式,它旗下的所有子类都可以用迭代器进行遍历; 而Map集合没有...
  • 通常我们在匹配数组或者集合的时候经常会无脑的去用多层for循环遍历。【别点我,我就是一个菜鸟】。偶然一次发现,当需要处理遍历匹配两个数组或者集合的时候利用map的效率会比for循环高出几十倍。在这里mark一下。 ...
  • // 通过for循环可以获取到数组中的...// 该文章不利用for循环进行数组的遍历 1. 先定义两个数组: var arr=[2,3,5,6,8]; var newArr=[] 2.forEach 可以遍历数组中的每一项 arr.forEach(function(item,ind...
  • HashMap的遍历效率讨论 经常遇到对HashMap中的key和value值对的遍历操作,有如下种方法: ...//第一个循环 Set appFieldDefIds = paraMap.keySet(); for (String appFieldDefId : appFieldDefIds)
  • 经常遇到对HashMap中的key和value值对的遍历操作,有如下种方法:Map paraMap = new HashMap();................//第一个循环Set appFieldDefIds = paraMap.keySet();for (String appFieldDefId : appFieldDefIds)...
  • java中集合类的遍历

    2016-05-12 15:38:49
    对于java中的集合类的遍历方式,对于Collection集合类主要有三种遍历方式,迭代器,for 循环和增强for循环Map常用的有种方式,那就是使用keyset及entryset进行遍历。 1 迭代器  它是一种常用的遍历方式,...
  • 我建立了两个Map,其流程是遍历两个map,将map1中value值与map2中相同,但是K值不同的数据查找出来。然后把这条数据从Map2中删除。我使用迭代器在执行移除的时候是报空指针(java.lang.NullPointerException)的错。...
  • 16.禁用双层for循环后的替代方法

    千次阅读 2019-12-25 14:46:46
    判断两个集合/数组中是否有相同值的思路: 1.将内层循环设为索引,new一个HashMap放入其中,遍历原先内层循环的集合或数组,然后map.push(),将key设为原先内层循环的值,将value设为1 2.判断时:原先的外层for循环不变,...
  • [js里面的那些循环遍历] (for…in…/for…of…/forEach/map) 在使用js去做循环遍历的过程中我们会遇到许多遍历的方法,那么这些方法都有什么区别,应用于什么场景呢?...为什么会这么说呢,以下两个例子就会让你...
  • HashMap的遍历效率讨论

    2014-09-27 20:41:39
    经常遇到对HashMap中的key和value值对的遍历操作,有如下种方法: Map paraMap = new HashMap(); ................ //第一个循环 Set appFieldDefIds = paraMap.keySet(); for (String appFieldDefId : ...
  • 遍历数组通常使用for循环,ES5的话也可以使用forEach,ES5具有遍历数组功能的还有map、filter、reduce等等,但是他们的输入参数和返回结果不一样。ES5中的for-in方法也具有相应的局限性,ES6中提出了for-of来弥补。 ...
  • 今天就简单的说一下项目中用到的一些循环map和foreach 两者既可以遍历数组也可以遍历对象,并且他们的用法和写法是相同的,都是通过callback来进行事件处理,而且传的参数也一样。下面使用map举例应用方式如下, ...
  • 一、Golang中删除map的方法 1、所有Go版本通用方法 ...这函数并没有显示的调用方法,当你使用for循环遍历删除所有元素时,Go的编译器会优化成Go内部函数mapclear。 package main func main() { m
  • 同学在调试python代码的两个for循环遍历时发现输出有问题,因为遍历的有map()在,由于这个可迭代对象的出现,导致map()只能循环迭代一轮。 问题实质: python中,map()对象,只能遍历一次,即从头遍历到尾,...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 211
精华内容 84
关键字:

for循环遍历两个map