js中的reduce()方法 讲解 和实现

reduce()

① 介绍:

该方法对数组中的每个元素 按序执行 一个提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值

② 语法以及参数说明:

reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)
  • accumulator : 上一次调用 callbackFn 的结果。在第一次调用时,如果指定了 initialValue 则为指定的值,否则为 array[0] 的值。

  • currentValue : 当前元素的值。在第一次调用时,如果指定了 initialValue,则为 array[0] 的值,否则为 array[1]

  • currentIndex : currentValue 在数组中的索引位置。在第一次调用时,如果指定了 initialValue 则为 0,否则为 1

  • array : 调用的数组本身

reduce使用的时候必须要有返回值,作为下次迭代的参数传入.后面实现源码的时候就会知道了,其实在for循环里面嵌套了一个callback函数

③ 使用场景

1. 求数组元素总和,求平均数
// 1. 求数组元素的和
const arr7 = [1, 2, 3, 4, 5]

// reduce要求有返回值的

const sum = arr7.reduce((temp,item,index,array)=>{
    console.log(temp,item); 
    return temp + item
},0)

const avg = sum / arr7.length
console.log(`平均值:${avg}`);

console.log("-------------------------");
console.log(`使用reduce api 求和之后:${sum}`);

// 下面看传统的求数组各个元素的总和的方法
let sum1 = 0;
arr7.forEach((item, index) => {
    sum1 += item
    console.log(index);
})
console.log(`使用forEach api 求和之后:${sum1}`);

accumulator(累加值)currentValue(当前元素的值)index(当前元素的索引)
010
121
332
643
1054
2. 统计数组各个元素出现的个数
// 2. 统计数组里面重复字段出现的个数
const arr4 = ["上海", "北京", "广州", "济南", "北京"]
// 定义一个空数组,用来存储每个元素的出现次数
const countArr = arr4.reduce((temp, item) => {
    // 这个对象里面存在item :"上海","北京"... 等键,就将该键的值加一
    if (temp[item]) {
        temp[item]++
    } else { // 如果不存在,就将该键 加入到空对象中,并赋值表示出现一次
        temp[item] = 1
    }
    // 遍历完之后将这个对象进行返回
    return temp
}, {}) //{} 初始temp 为一个空对象
// 将countArr数组中的元素添加到temp数组中,并返回
console.log(countArr); // {上海:1,北京:2,广州:1,济南:1}

3. 数组过滤

这里可以使用reduce的第四个参数,initialValue初始值我们给他一个[] 空数组,作为累积值(上一次回调函数的返回值初始值),如果传入第四个参数 这里就是初始值.

如果数组中的某一项 能够整除2 就将该元素放入初始好的[]空数组,相反不能够整除2 我们就放入外面定义好的arr3这个数组里面.

当数组里面全部元素遍历完毕之后,我们再将temp进行一个return返回,这时候我们就拿到原数组里面所有能够整除2的元素了.

// 3. 对数组进行一个过滤 (奇偶数分离)
const numArr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const arr3 = []
const filterNumArr = numArr1.reduce((temp, item) => {
    if (item % 2 === 0) {
        temp.push(item)
    } else {
        arr3.push(item)
    }
    return temp
}, [])
console.log(filterNumArr); // [2,4,6,8,10]
console.log(arr3);//[1,3,5,7,9]
4. 对数组各项进行相同的操作 (增加n倍,缩小n倍…)

这个和上面那个思路相同. 只不过执行的操作不同. 但都是通过内置的for循环对数组中的各个元素进行某个操作的.


// 4. 对数组各项进行相同的操作
const numArr = [1, 2, 3, 4, 5]
const doublenumArr = numArr.reduce((temp, item) => {
    temp.push(item * 2)
    return temp
}, [])
console.log(doublenumArr); // [2,4,6,8,10]
5. 数组去重

如果数组temp 不包含item也就是 arr5里面的各个元素,就将该元素放入temp.

这里使用到数组的另外一个api includes()

includes()方法是用于判断一个数组或字符串是否包含指定的值,并返回一个布尔值。该方法可以用于数组和字符串。


// 5. 数组去重
const arr5 = [2, 2, 3, 3, 5, 3, 5, 9, 9, 10]
const uniqueArr = arr5.reduce((temp, item) => {
    if (!temp.includes(item)) {
        temp.push(item)
    } else {
        console.log("重复的元素", item);
    }
    return temp

}, [])
console.log("数组去重",uniqueArr); // [2,3,5,9,10]

6. 对象属性值的总和

Object.values(cost) 返回该对象所有可枚举属性的值组成的数组


const cost = {
    "snack": 20,
    "cloth": 300,
    "drink": 50,
    "shop": 500
}

// 属性值的总和
// Object.values(cost) 转换为数组
const sum1 = Object.values(cost).reduce((temp, item) => {
    return temp + item
})
console.log(sum1); // 870

④ 实现一个reduce方法

// 自行封装一个reduce
Array.prototype.reduce1 = function (fn, initVal) {
    // 首先定义一个数组
    var arr = this;

    // 如果调用api的人第一个参数不是function,进行一个抛错
    if (typeof fn !== "function") {
        // 第一个参数必须是函数
        throw new TypeError("First argument must be a function");
    }

    // 第一种情况:使用者没有传入初始值initVal
    if (typeof initVal === "undefined") {
        // 初始值是数组的第一个元素
        initVal = arr[0];
        // 循环遍历数组
        for (var i = 1; i < arr.length; i++) {
            // 调用reduce方法
            //每次执行一遍这个fn函数 就会返回一个值 并且重新赋值给initvalue ,并在下次调用
            initVal = fn(initVal, arr[i], i, arr);

        }

    }
    // 第二种情况: 使用者传入了初始值 initVal
    else {
        for (var i = 0; i < arr.length; i++) {
            initVal = fn(initVal, arr[i], i, arr);
        }
    }

    // 最后将这个值进行一个返回
    return initVal

};

// 测试用例 求数组总和 
var arr = [1, 2, 3, 4, 5];
var sum = arr.reduce1((initVal, temp, index, arr) => {
    return initVal + temp;
});

console.log(sum); // 15

使用reduce() 可以搭配其他关于数组的api 实现更多的需求

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
reduce() 是 JavaScript 数组的一个高阶函数,它作用于数组的每个元素,将它们依次处理并最终返回一个值。reduce() 方法接受一个回调函数作为参数,并且可以接受一个初始值。 reduce() 方法的语法如下: ```javascript array.reduce(callback[, initialValue]) ``` 参数解释: - callback:一个回调函数,用于处理数组的每个元素。该函数可以接受四个参数:accumulator(累加器),currentValue(当前值),currentIndex(当前索引),和 array(原始数组)。 - initialValue(可选):作为第一次调用 callback 函数时的第一个参数,如果没有提供该参数,则使用数组的第一个元素作为初始值。 回调函数的返回值将作为下一次调用回调函数时的 accumulator 参数。最后一次调用回调函数的返回值将成为 reduce() 方法的返回值。 下面是一个简单的示例,演示了如何使用 reduce() 方法计算数组所有元素的总和: ```javascript const numbers = [1, 2, 3, 4, 5]; const sum = numbers.reduce((accumulator, currentValue) => { return accumulator + currentValue; }, 0); console.log(sum); // 输出 15 ``` 在这个示例,初始值为 0。在每次迭代,回调函数将累加器(初始值或上一次迭代的返回值)与当前元素相加,并返回结果。最终得到累加器的值为 15,这就是 reduce() 方法的返回值。 除了计算数组元素的总和,reduce() 方法还可以用于实现其它功能,如查找最大值、最小值、平均值等。根据需要编写不同的回调函数即可。 希望这个解释对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值