数组遍历的那些事

268 阅读7分钟

一、思考一下数组遍历有哪些方法?

每当写代码时,看到数组的遍历,脑海里第一浮现的一定是 for 循环 对于这个方法,大家肯定甚是熟悉,拿到数组,一看要遍历,拿起 for 循环就是干, 管他有没有其他方法,博主之前也是这样,但自从接触到其他的方法后,我就真香了。 下面我们来看看有哪些好用的方法吧。

1.forEach

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

注意: forEach() 对于空数组是不会执行回调函数的。

//举例说明
let arr = [1, 2, 3]
/**forEach方法中回调函数接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
arr.forEach((currentValue, index, arr) => {
  console.log(currentValue, index, arr)
})
/**打印结果:
 * 1 , 0 , [1,2,3]
 * 2 , 1 , [1,2,3]
 * 3 , 2 , [1,2,3]
 **/

对于 forEach 有个注意点,forEach 不能像 for 循环一样可以 return 结束循环, 也不支持 break 和 continue,但我们可以用 try catch 来解决,让他可以跳出循环, 这里咱就不扯远了 , try catch 解决方法

2.map

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map() 方法按照原始数组元素顺序依次处理元素。

//举例说明
let arr = [1, 2, 3]
/**map方法中回调函数也接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
let res = arr.map((currentValue, index, arr) => {
  return currentValue * 2
})
/**打印结果:
 *  [2,4,6]
 **/

map 方法类似我拿到数组中的每个值,并对他进行操作. 比如对他进行运算,并拿到运算后的值,当然他不会改变原数组,会返回一个新数组

3.filter

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

注意: filter() 不会对空数组进行检测。注意: filter() 不会改变原始数组。

//举例说明
let arr = [1, 2, 3]
/**filter方法中回调函数也接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
let res = arr.filter((currentValue, index, arr) => {
  return currentValue > 1
})
/**打印结果:
 *  [2,3]
 **/

filter 方法的作用同他的词意,起过滤的作用,返回的数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。

4.some

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。

some() 方法会依次执行数组的每个元素: 如果有一个元素满足条件,则表达式返回 true , 剩余的元素不会再执行检测。如果没有满足条件的元素,则返回 false。

注意: some() 不会对空数组进行检测。注意: some() 不会改变原始数组。

//举例说明
let arr = [1, 2, 3]
/**some方法中回调函数也接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
let res = arr.some((currentValue, index, arr) => {
  return currentValue === 1
})
let boolen = arr.some((currentValue, index, arr) => {
  return currentValue === 5
})
/**打印结果:
 *  true
 *  false
 **/
/**some方法,数组中只要有一个值满足条件,则返回true,否则返回false
 * 比如some去相亲,在相亲前,他有自己的一个要求,只要相亲对象达到要求
 * 他就接受了,并不会再继续相亲了,真是专一男人
 **/

some 方法,数组中只要有一个值满足条件,则返回 true,否则返回 false。 比如 some 兄弟去相亲,在相亲前,他有自己的要求,只要有一个相亲对象达到要求他就接受了,并不会再继续相亲了,真是专一的男人!!

5.every

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。

every() 方法使用指定函数检测数组中的所有元素:如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。如果所有元素都满足条件,则返回 true。

注意: every() 不会对空数组进行检测。注意: every() 不会改变原始数组。

//举例说明
let arr = [1, 2, 3]
/**every方法中回调函数也接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
let every = arr.every((currentValue, index, arr) => {
  return currentValue > 0
})
let boolen = arr.every((currentValue, index, arr) => {
  return currentValue > 1
})
/**打印结果:
 *  true
 *  false
 **/

every 小兄弟就比较傲娇了,必须全部满足我的要求,不然我就不干了。

6.find

find() 方法返回通过测试(函数内判断)的数组的第一个元素的值。

find() 方法为数组中的每个元素都调用一次函数执行:当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,#### 之后的值不会再调用执行函数。如果没有符合条件的元素返回 undefined 注意: find() 对于空数组,函数是不会执行的。

注意: find() 并没有改变数组的原始值。

//举例说明
let arr = [1, 2, 3]
/**find方法中回调函数也接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
let res = arr.find((currentValue, index, arr) => {
  return currentValue === 1
})
let res1 = arr.find((currentValue, index, arr) => {
  return currentValue === 6
})
/**打印结果:
 *  1
 *  undefined
 **/

find 方法有点类似 some 方法,不过不同的是 find 方法会拿到值 这样看来,还是 find 兄弟腻害,不仅找到了满足要求的相亲对象,还把相亲对象带回了家

7.findIndex

findIndex() 方法返回传入一个测试条件(函数)符合条件的数组第一个元素位置。

findIndex() 方法为数组中的每个元素都调用一次函数执行:当数组中的元素在测试条件时返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。如果没有符合条件的元素返回 -1

注意: findIndex() 对于空数组,函数是不会执行的。注意: findIndex() 并没有改变数组的原始值。

//举例说明
let arr = [1, 2, 3]
/**findIndex方法中回调函数也接收的三个参数
 * currentValue :必需。当前元素
 * index: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 **/
let res = arr.findIndex((currentValue, index, arr) => {
  return currentValue === 1
})
let res1 = arr.findIndex((currentValue, index, arr) => {
  return currentValue === 6
})
/**打印结果:
 *  0
 * -1
 **/

findIndex 有点类似 find 方法,哈哈哈,这兄弟咋都挺挺像的,findIndex 方法不拿到值,而是值的索引

8.reduce

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。reduce() 可以作为一个高阶函数,用于函数的 compose。

注意: reduce() 对于空数组是不会执行回调函数的。

//举例说明
let arr = [1, 2, 3,4]
/**reduce方法中回调函数接收的四个参数
 * total :	必需。初始值, 或者计算结束后的返回值。
 * currentValue :必需。当前元素
 * currentIndex: 可选。当前元素的索引值。
 * arr: 可选。当前元素所属的数组对象。
 * reduce第二个参数
   initialValue:	可选。传递给函数的初始值 (如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。)
 **/
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0)
console.log(arr, sum);
/**打印结果:
0 1 0
1 2 1
3 3 2
6 4 3
[1, 2, 3, 4] 10
 **/

reduce还有很多高级的用法,比如数组去重和数组扁平化等,这里我们只了解简单用法

二、结语

对于数组的遍历方法还有很多,我就不一一介绍了,这些东西虽然简单,但整理一下还是好的,对于小白来说还是有参考价值的, 当然,还是希望大佬勿喷。哈哈哈哈