首先,分析原有的Array.prototype.reduce
reduce是一种归并方法,对每一项都会运行一个归并方法(计算数组之和可以使用)
参数:
reduce(callback[,initialVlaue])
其中:
callback
: 数组中每个元素执行操作的方法,必选
initialValue
:初始值,可选
操作函数:callback(prev,cur[,index,arr])
prev: 前面操作的结果,有initialVlaue的时候,开始执行的时候prev=initialValue;没有initialValue的时候,prev = 数组的第0项
cur: 当前数组遍历到的值
index:cur在数组中的索引
arr:遍历的数据
最终实现版
// 判断类型
function type(x) {
return Object.prototype.toString.call(x).slice(8, -1);
}
Array.prototype.doReduce = function(/*callback,initial_value*/){
let context = this,
callback = arguments[0];
if(type(callback) !== 'Function') {
throw new TypeError(`${callback} is not a function`);
}
let context_type = type(context);
if(context_type !== 'Array') {
throw new TypeError('${context} is not a Array');
}
let {length} = context,
k = 0,
res = null;
// 判断是否传递了 初始化参数
let initial_value = arguments.length > 0
? arguments[1]
: context[k++];
res = initial_value;
for(; k < length; k++) {
res = callback(res, context[k], k, context);
}
return res;
}
// 原有的reduce实现功能
let arr = [1, 2, 3, 4, 5];
let ans = arr.reduce((prev, cur) => prev += cur, 0);
console.log(ans);
let ans2 = arr.doReduce((prev,cur) => prev += cur, 0);
console.log(ans2);