数组遍历(for,forin,forof,forEach,map,filter,some,every,reduce)

2024-03-09 19:58

本文主要是介绍数组遍历(for,forin,forof,forEach,map,filter,some,every,reduce),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 数组遍历方法总结
    • for 循环
    • for...in 循环
    • for...of 循环
    • forEach 循环
    • map 循环
    • filter 循环
    • some 循环
    • every 循环
    • reduce 循环

数组遍历方法总结

这里记录一下,目前常用的针对数组的一些循环操作,以便以后随时翻阅。

  • 所有循环讲解主要部分均由代码展示,更简明明了。

for 循环

for 循环没啥说的,不过要记得:针对for循环,循环条件总比循环体要多执行一次。不过这个无伤大雅,一般我们都会忽略,下面看代码:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]for(let i = 0; i < arr.length; i++) {let value = arr[i];console.log(value);
}# 输出结果:
# 1 2 3 4 5 6 7 8 9

for…in 循环

注意:for…in循环非常不建议用在数组上,for…in是为遍历对象属性而构建的,当然数组也可以用。

for...in循环在使用过程中要小心一点,可能会出现问题,这个下面会说到。先看 for…in 的使用:

const arr: any = [1, 2, 3, 4, 5, 6, 7, 8, 9];for(const key in arr) {console.log(key);
}# 输出结果:
# "0" "1" "2" "3" "4" "5" "6" "7" "8"

for…in 循环可以拿到数组的 key 值。针对上面的arr数组,拿到的也是key值,这个大家可以通过console.dir(arr) 来验证。

for…in使用时的bug:

这个bug的出现也具有一定的特殊性,就是我们对数组进行扩展时,使用forin循环,比如这样:

const arr: any = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// 给数组增加一个name属性
arr.name = '李明';for(const key in arr) {console.log(arr[key]);
}
# 输出结果
# 1 2 3 4 5 6 7 8 9 "李明"for(let i = 0; i < arr.length; i++) {console.log(arr[i])
}
# 输出结果
# 1 2 3 4 5 6 7 8 9

可以看到 forin 循环比着for循环要多输出了一个 ”李明“ ,为啥会这样呢?首先我们要知道一点:

  • for…in语句以任意顺序遍历一个对象的除Symbol以外的可枚举属性 。
  • 很不巧,我们这样给arr增加的name属性是可枚举的,forin甚至可以遍历到你给Array.prototype增加的属性与方法遍历出来。

所以这样就会导致很多意外的结果和错误。

再者,for循环为啥就不会出错呢?

  • for 循环 ,循环的是次数,for循环不关注属性。

当然我们写代码的时候 尽量要保证数组中数据类型的唯一性,比如利用Typescript:

const arr:number = [1,2,3]

arr.name = 4;

如果强行编译,还是会加上的,但是Typescript会报给我们一个错误:Property 'name' does not exist on type 'number'.

总而言之,不建议使用forin遍历数组。

for…of 循环

for…of语句在 可迭代对象(包括 ArrayMapSetStringTypedArray,arguments对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句 。

for of循环是ES6的新增方法,针对for in循环的bug,for of循环就不会有问题:

const arr:any = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.name = 12;for(const item of arr) {console.log(item)
}# 输出结果:
# 1 2 3 4 5 6 7 8 9

使用for of 循环遍历数组,其结果就是打印出数组中的每一个值,所以可以放心使用。

附加:

  • 如果使用for…of 循环时也想得到数组的下标或者是key,可以利用arr.keys()

    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];for (let key of arr.keys()) {console.log(key)
    }# 输出结果:
    # 0 1 2 3 4 5 6 7 8
    
  • 如果使用for…of循环,既想得到key 也想得到 value ,可以利用arr.entries():

    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];for (let [key, val] of arr.entries()) {console.log(key, val)
    }# 输出结果:
    # 0,  1 
    # 1,  2 
    # 2,  3 
    # 3,  4 
    # 4,  5 
    # 5,  6 
    # 6,  7 
    # 7,  8 
    # 8,  9 
    

forEach 循环

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];arr.forEach((item, index, arr) => {console.log(item)
});# 输出结果:
# 1 2 3 4 5 6 7 8 9

注意:

  • forEach 循环对于空数组是不会执行回调函数的。
  • forEach 循环接受三个参数,[第一参数]为数组中的每一项,[第二参数]为数组的下标,[第三个参数]为你要遍历的数组本身。第二和第三参数都是可选的。
  • forEach 循环本身不支持 continue 和 break语句的
    • 如果想实现continue效果,可以使用 return。
    • 如果要实现break效果,建议使用 every 和 some 循环。(这个后面会讲到)

map 循环

map循环返回一个经过调用函数处理后的新的数组

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];const res = arr.map((item,index,arr)=>{return item + 1
})
console.log(res)# 输出结果:
# [2, 3, 4, 5, 6, 7, 8, 9, 10] 

注意:

  • map 循环不会对空数组进行检测 。

  • map 循环必须 return 。

  • map 循环不会修改原数组。

  • map 循环接受三个参数,[第一参数]为数组中的每一项,[第二参数]为数组的下标,[第三个参数]为你要遍历的数组本身。第二和第三参数都是可选的。

  • map 循环会针对每一项都进行循环,如果跳过则会返回 undefined,例如:

    const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];const res = arr.map(item=>{if(item > 3) {return item;}
    })
    console.log(res)# 输出结果:
    # [undefined, undefined, undefined, 4, 5, 6, 7, 8, 9] 
    

filter 循环

filter() 循环返回一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];const res = arr.filter((item,index,arr)=>{return item > 3;
});
console.log(res)# 输出结果:
# [4, 5, 6, 7, 8, 9] 

注意:

  • filter 循环不会对空数组进行检测。
  • filter 循环不会改变原数组。
  • filter 循环接受三个参数,[第一参数]为数组中的每一项,[第二参数]为数组的下标,[第三个参数]为你要遍历的数组本身。第二和第三参数都是可选的。

some 循环

some 循环查找数组中任意符合条件的元素并返回boolean值,当数组中有任意元素符合条件就返回 true 否则返回 fasle

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];const res = arr.some((item,index,arr)=>{return item > 3
})
console.log(res)# 输出结果:
# true

注意:

  • some 循环会依次执行数组的每一个元素。
  • 如果有一个元素满足条件,则返回 true,且剩余的元素不会在执行检测 即 循环结束。
  • some 循环不会对空数组进行检测
  • some 循环不会改变原数组
  • some 循环接受三个参数,[第一参数]为数组中的每一项,[第二参数]为数组的下标,[第三个参数]为你要遍历的数组本身。第二和第三参数都是可选的。

every 循环

every 循环查找数组中所有符合条件的元素并返回boolean值,只有当数组中有所有元素都符合条件才返回 true 否则返回 fasle

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];const res = arr.every((item,index,arr)=>{return item > 3
})
console.log(res);# 输出结果:
# false

注意:

  • every 循环会检测数组的每一个元素
  • 如果有一个元素不满足条件,则返回false,且剩余元素不在检测 即 循环结束。
  • every 循环不会对空数组进行检测
  • every 循环不会改变原数组。
  • every 循环接受三个参数,[第一参数]为数组中的每一项,[第二参数]为数组的下标,[第三个参数]为你要遍历的数组本身。第二和第三参数都是可选的。

reduce 循环

reduce() 循环接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];const res = arr.reduce((total,item,index,arr)=>{return total + item;
}, 0)
console.log(res);# 输出结果:
# 45

注意:

  • reduce 循环对于空数组是不会执行回调函数的。

  • reduce 循环接受一个回调函数,和一个初始值。

    • 回调函数接受四个参数:[第一参数]为数组中的每一项累加和,[第二参数]为数组的每一项,[第三个参数]为数组的下标,[第四个参数]为你要遍历的数组本身。第三和第四参数都是可选的。

    • 初始值,即为指定第一次循环时,累加参数[total] 的值。

      • 例如 demo 中,指定初始值为 0,则reduce循环的状态为:

        [total + item]
        0
        0 + 1 = 1
        1 + 2 = 3
        3 + 3 = 6
        ...
        36 + 9 = 45
        
  • reduce 可以作为一个高阶函数,用于函数的 compose。

  • 当然reduce 的作用也不单单只作为一个累加器来用,我们还可以利用reduce的特性做其他的用途,比如数组的去重


以上就是我记录的 数组的遍历方法了 。 完结·撒花

这篇关于数组遍历(for,forin,forof,forEach,map,filter,some,every,reduce)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/791785

相关文章

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代