# 题目描述
实现Array.reduce函数的功能且该新函数命名为"_reduce"
。
# 测试用例
function() {const result = [-2,-1,0,1,2]._reduce((left, right) => left + right);return result === 0}
1
- 预期输出: true
# 思路分析
根据题目要求,实现一个仿Array.reduce
功能的"Array._reduce"
函数,并且需要将”_reduce“
函数挂载在Array
的原型对象上。根据Array.reduce
的特点有:
reduce四个参数
- preVal:前一个回调函数返回的前一个值。开始时是初始值
- currVal:数组的当前元素
- currentIndex:当前索引,可选的 ——一般不用
- arrayToTraverse:要遍历的数组。可选的 —— 一般不用
接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值 可以接收一个初始值,当没有初始值时,默认初始值为数组中的第一项 实现该函数的核心步骤有:
- 在
Array
的原型对象上添加”_reduce“
函数 "_reduce"
函数第一个参数为回调函数,第二个参数为初始值- 进入数组长度的循环体中
- 当初始值为空时,首个被加数为数组的第一项
- 当初始值不为空时,首个被加数为初始值
# 代码实现
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
</head>
<body>
<script type="text/javascript">
// 补全代码
Array.prototype._reduce = function(callback, prev) {
for(let i = 0; i < this.length; i ++){
if(!prev){
// 没有初始值就把第一项当做初始值,实际是要从第二项开始的
prev = callback(this[i], this[i + 1], i + 1, this);
// i++ 其实只有第一次会执行, 让_reduce少遍历一次
i ++;
}
else{
//
prev = callback(prev, this[i], i, this);
}
}
return prev;
}
</script>
</body>
</html>
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
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