# 题目描述

实现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四个参数

  1. preVal:前一个回调函数返回的前一个值。开始时是初始值
  2. currVal:数组的当前元素
  3. currentIndex:当前索引,可选的 ——一般不用
  4. arrayToTraverse:要遍历的数组。可选的 —— 一般不用

接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值 可以接收一个初始值,当没有初始值时,默认初始值为数组中的第一项 实现该函数的核心步骤有:

  1. Array的原型对象上添加”_reduce“函数
  2. "_reduce"函数第一个参数为回调函数,第二个参数为初始值
  3. 进入数组长度的循环体中
  4. 当初始值为空时,首个被加数为数组的第一项
  5. 当初始值不为空时,首个被加数为初始值

# 代码实现

<!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