JavaScript中级篇: reduce()函数
初了解 JavaScript中reduce()函数
最近一段时间,有个朋友问了我reduce()函数怎么使用,我的理解停留在这个函数是用来计算一些简单的加减乘除,但是调用对象时使用该函数,会出现对象无法相加的情况,对此我对reduce()函数进行了一系列思考。
//这是有疑惑的代码
const product = {
data: [
{
id: 1, name: "电脑", price: 7000, num: 10000 },
{
id: 2, name: "手机", price: 1999, num: 10000 },
{
id: 3, name: "平板", price: 3999, num: 10000 },
{
id: 4, name: "相机", price: 12999, num: 10000 },
],
getTotalPrices: function() {
return this.data.reduce((t, c) => {
return t += c.price * c.num });
}
}
输出的结果是这样的[object Object]1999000039990000129990000刚开始我是不理解的。
所以我开始对reduce()函数进行的基础的了解
一、 首先是语法和参数
arr.reduce(function(prev,cur,index,arr){
...
}, init);
-
参数值解析
实现以下需求的方式有很多,其中就包含使用reduce()的求解方式,也算是实现起来比较简洁的一种吧。
二、 reduce()实例 先提供一个原始数组:
var arr = [3,9,4,3,6,0,9];
实现以下需求的方式有很多,其中就包含使用reduce()的求解方式,也算是实现起来比较简洁的一种吧。 1. 求数组之和
var sum = arr.reduce((p, c) => p + c, 0); console.log(sum); //输出结果为34
2. 求数组项最大值
var max = arr.reduce((p, c) => Math.max(p, c), 0); console.log(max); //输出值为9 var max = arr.reduce((p, c) => Math.max(p, c), 10); console.log(max); //输出值为10
由于传入初始值10,所以开始时prev的值即init值为10,c的值为数组第一项3,取两值最大值后继续进入下一轮回调。
三、知道reduce()参数是什么意思后,我开始探索初始值对函数结果的影响
1.我探讨了init值即初始值为不同类型数值时对函数的回调结果的影响
var arr = [1, 2, 3];
//init值为空
var sum = arr.reduce((p, c) => p + c);
console.log(sum, typeof sum);
//init值为数值1
var sum = arr.reduce((p, c) => p + c, 1);
console.log(sum, typeof sum);
//init值为数组
var sum = arr.reduce((p, c) => p + c, []);
console.log(sum, typeof sum);
//init值为对象
var sum = arr.reduce((p, c) => p + c, {
});
console.log(sum, typeof sum);+
//init值为布尔值
var sum = arr.reduce((p, c) => p + c, true);
console.log(sum, typeof sum); //true值为看做是1,输出7
这是函数的输出值,我们可以看到,
2. 回到开始的那段代码
//这是有疑惑的代码
const product = {
data: [
{
id: 1, name: "电脑", price: 7000, num: 10000 },
{
id: 2, name: "手机", price: 1999, num: 10000 },
{
id: 3, name: "平板", price: 3999, num: 10000 },
{
id: 4, name: "相机", price: 12999, num: 10000 },
],
getTotalPrices: function() {
return this.data.reduce((t, c) => {
return t += c.price * c.num },0);
}
}
输出的结果259970000 显而易见,但初始值为数组或者对象时,函数都不能够正常输出结果,使用我们使用reduce处理计算时,一般都会设置init值为数值0,从而保证结果的可执行性,我们把上面的代码改一下就可以了。
