实现一个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
// 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
上次更新: 2022/7/26 下午2:33:39