js用递归遍历多维数组_JS数组的遍历上 (含forEach等方法源码)

这篇博客详细介绍了JS中用于遍历数组的几种方法,包括forEach、filter、map、reduce和reduceRight。通过源码实现,解释了这些方法的工作原理和参数含义,并提供了效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

forEach()

方法用于调用数组的每个元素(循环遍历数组中的每一个元素),并将元素传递给回调函数。

它内部的回调函数可以传入三个参数:function(item, index, arr)

item为必填参数,表示当前元素

index为可选参数,表示当前元素的索引

arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。

939d25004f729bab41f5b8d7135bda59.png

forEach源码实现:

Array.prototype.myForEach = function(callback) {for (let i = 0; i < this.length; i++) {callback(this[i], i, this)}}
a6cab575a23d9a3be0104b96921ddad4.png

对比原生:

3d05aedf8747b7185228cd387ae06fa2.png

嗯。可以看出,应该是没错的!

filter()

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

。。官方解释比较坑,大致就是说它首先创建了一个空数组,然后筛选callback的返回值,如果返回值可以隐式转换成true,则将对应的元素push到那个空数组中!

它内部的回调函数可以传入三个参数(同forEach完全一样)

item为必填参数,表示当前元素

index为可选参数,表示当前元素的索引

arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。

不同于forEach,它是有返回值的,找个变量接收即可:

e26fc3907128f8c74f21c809c4a917f3.png

filter源码实现:

Array.prototype.myFilter = function(callback) {let newArr = []for (let i = 0; i < this.length; i++) {if (callback(this[i], i, this)) {newArr.push(this[i])}}return newArr}
b6fc9e86d96bf8e90b50d88a4eefc64c.png

效果测试:

9e96badfa746dcc2f6583b97c6e36a39.png

map()

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

这个就比较好理解了,意思就是它也有返回值,它的返回值就是将你正在遍历的那个数组中的回调函数中的return返回值挨个push到它提前创建好的空数组中!

它内部的回调函数可以传入三个参数(同forEach完全一样)

item为必填参数,表示当前元素

index为可选参数,表示当前元素的索引

arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。

eg:

9d64096e30bc8e56b3426db8d4994510.png

map源码实现:

Array.prototype.myMap = function (callback) {let newArr = []for (let i = 0; i < this.length; i++) {newArr.push(callback(this[i], i, this))}return newArr}
02345520294f9b34f8c969ed74558b55.png

效果展示:

a183529acd352f0cd939f7e54a4cb255.png

reduce()

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

和之前的数组方法一样,它也需要传入一个回调函数作为参数。出了回调函数之外,它还可以穿入一个形参(initialValue)作为初始值。

不同于之前,它的第一个参数发生变化:

array.reduce(function(pre, item, index, arr) {},initialValue)中

pre为必填参数,上一次调用回调返回的值,或者是提供的初始值 initialValue

item为必填参数,表示当前元素

index为可选参数,表示当前元素的索引

arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。

刚刚的有一点没有说明,就是当 initialValue 传参的时候,pre的初始值为initialValue ,如果 initialValue 没有传出,则 pre 为数组中的第一个元素。

其次,如果initialValue 没有传参,pre 为数组中的第一个元素。那么item将从数组中第二个开始。

71615992e712dc704f241612e3d8c21c.png

反之正常顺序:

77e24ba255f6959714c9b93178af6d92.png

en,这东西其实用的地方不多,不过它效率要比forEach快几十倍,,反正我没用过~~~~

reduce源码实现:

Array.prototype.myReduce = function(callback, init) {let previous = init || this[0]let i = 0if (init === undefined) i = 1for (i; i < this.length; i++) {previous = callback(previous, this[i], i, this)}return previous}
65113328779d0246f67162b45c5f4094.png

效果展示:

6a17a1940c2b9d4dc8a2016f8c5cce6a.png
21bda2d4ec54e5fd596d386ecd667161.png

reduceRight()

同reduce()类似,不过不同的是 reduceRight() 从数组的末尾向前将数组中的数组项做累加(reduce自左往右累加,reduceRight自右往左累加)。

参数也都是一样的!

array.reduceRight(function(pre, item, index, arr) {},initialValue)中

pre为必填参数,上一次调用回调返回的值,或者是提供的初始值 initialValue

item为必填参数,表示当前元素

index为可选参数,表示当前元素的索引

arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。

使用细节参照reduce即可,我就不水了~

对啦,如果没有传初始值,pre默认是最后一个元素: this[this.length -1]

eg:

d7bf48a24fbeaa31f76455efb62c29f9.png

reduceRight源码实现:

Array.prototype.myReduceRight = function(callback, init) {let previous = init || this[this.length - 1]let i = this.lengthif (init === undefined) i = this.length - 1for (i; i > 0; i--) {previous = callback(previous, this[i-1], i, this)}return previous}
491a5115b6fba3b13b7a56f183a4e92e.png

效果展示:

950e2107b3866de88667d6d45362e4e1.png

传入初始值时:

5f9cacd727e17cb72c151d3d756cc048.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值