实现一个reduce
# 实现一个reduce
// 实现代码
Array.prototype.myReduce = function(callback, initialValue) {
if (typeof callback !== 'function') {
throw new TypeError('callback must be a function')
}
if (!this.length && initialValue === 'undefined') {
throw new TypeError('Reduce of empty array with no initialValue')
}
const array = this
let prev = initialValue ?? array[0]
let startIndex = initialValue ? 0 : 1
for(let i = startIndex; i < array.length; i++) {
prev = callback(prev, array[i], i, array)
}
return prev
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// reduce 是一个数组方法
// 会对数组的每个元素进行处理,处理的函数作为形式参数传入
// reduce 最后只返回一个结果
// arr 累计器
// cur 当前值
// index 索引
// array 原数组
// 每处理一个元素, callback 都有返回值,这个返回值就是累计器,并最终成为单个结果
// arr.reduce((acc, cur, index, arr) => {}, initialValue)
// reduce 是个函数,且有一个返回值
// reduce 接受两个参数,callback 和初始值
// callback 接受四个参数,累加器,当前值,当前索引,原始数组
Array.prototype.myReduce = function (callback, initialValue) {
const originArr = this
if (!originArr.length) {
return '你这个是空数组啊'
}
// 累计器
let accumular
if (initialValue === undefined) {
accumular = originArr[0]
} else {
accumular = initialValue
}
for(let i = 0; i < originArr.length; i++) {
// 如果没有初始值 而且是最后一次循环,不再执行callback
if (initialValue === undefined && (i+1) === originArr.length) break
accumular = callback(accumular, initialValue === undefined ? originArr[i + 1] : originArr[i], i, originArr)
}
return accumular
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33