zl程序教程

您现在的位置是:首页 >  后端

当前栏目

原生js源码之Array的reduce方法

JS方法源码 原生 Array reduce
2023-09-11 14:21:46 时间

reduce方法对数组中的每个元素执行一个由您提供函数,将其结果汇总为单个返回值。

语法:

arr.reduce(callback(accumulator, item[, index[, array]])[, initialValue])

arr:原数组

callback:回调函数

accumulator:累加器

item:当前元素

index:当前索引

array:原数组

initialValue:初始值(可选),如果没有填写则默认取数组的第一个元素,若此时数组是空数组则会报错。

下面来写一下代码:

Array.prototype.myReduce=function(callback,initValue){
	//如果没有传入回调函数,则报错
	if(!callback) throw new TypeError('undefined is not a function');
	if (typeof callback !== 'function') {//传入的不是函数也报错
      throw new TypeError(callback + " is not a function");
    }
    var res,n=0;//定义返回结果以及定义数组循环开始的下标
    if(initValue){//如果有设置初始值
    	res = initValue;
    }else{//如果没有初始值则把数组的第一个元素赋值给返回结果
    	if(this.length===0){
    		throw new TypeError('Reduce of empty array with no initial value');
    	}else{//将第一个数组元素作为初始值
    		res = this[0];
    		n=1;//那数组循环的下标就应该是1
    	}
    }
	for(var i=n,len=this.length;i<len;i++){
		res = callback(res,this[i],i,this);//将函数的返回值赋值给返回结果
	}
	return res;//返回结果
}

测试一下:

var arr = [1,3,5,7,9]
var res=arr.myReduce(function(sum,item,index,thisArr){
	return sum+item
});
console.log(res);

输出:25

再设置一下初始值10试一下:

输出:35

结果正常

写一个测试去重的代码测试 :

 var arr2 = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
var res2=arr2.myReduce(function(sum,item,index,thisArr){
	if(sum.indexOf(item)==-1){
		sum.push(item)
	}
	return sum
},[]);
console.log(res2)

输出:

(5) ["a", "b", "c", "e", "d"]

这种要求返回数组的需要设置初始值,否则会报错

完成收工!