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);
    参数值解析
参数 功能 prev(必选) 表示上一次调用回调时的返回值,或者初始值 init; cur (必选) 表示当前正在处理的数组元素; arr(可选) 表示原数组 index(可选) 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1; init(可选) 表示初始值。为了保险,通常会设置为0

实现以下需求的方式有很多,其中就包含使用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,从而保证结果的可执行性,我们把上面的代码改一下就可以了。

经验分享 程序员 微信小程序 职场和发展