reduce 基本使用

这篇博客详细介绍了JavaScript中Array.prototype.reduce()方法的基本用法和常见应用场景,包括数组求和、求积、计算元素出现次数、数组去重以及求和数组对象的特定属性。通过实例展示了reduce在处理数组时的强大功能。

基本语法

arr.reduce((prevVal,curVal,index,arr)=>{
...
},init)
  • prevVal:必须,初始值或上一次返回结果
  • curVal:必须,当前元素
  • index:可选,当前元素索引
  • arr:可选,原数组
  • init:可选,初始值

应用

  • 求和

const arr = [1,2,3,4,5];
const res =  arr.reduce((prevVal,curVal,index,arr)=>{
  return prevVal + curVal;
});

// 15
const arr = [1,2,3,4,5];
const res =  arr.reduce((prevVal,curVal,index,arr)=>{
  return prevVal + curVal;
},2);

// 17
  • 求积

const arr = [1,2,3,4,5];
const res =  arr.reduce((prevVal,curVal,index,arr)=>{
  return prevVal * curVal;
});

// 120
  • 计算数组元素出现次数

const arr = [1,2,3,4,5,2,2,2,5,1];
const res =  arr.reduce((prevVal,curVal,index,arr)=>{
  if(curVal in prevVal){
    prevVal[curVal]++;
  }else{
    prevVal[curVal]=1;
  }
  return prevVal;
},{});

// { '1': 2, '2': 4, '3': 1, '4': 1, '5': 2 }
  • 数组去重

const arr = [1,2,3,4,5,2,2,2,5,1];
const res =  arr.sort().reduce((prevVal,curVal,index,arr)=>{
 if(prevVal.length===0||prevVal[prevVal.length-1]!==curVal){
  prevVal.push(curVal)
 }
 return prevVal;
},[]);

// [ 1, 2, 3, 4, 5 ]
const arr = [1,2,3,4,5,2,2,2,5,1];
const res =  arr.reduce((prevVal,curVal,index,arr)=>{
if(prevVal.indexOf(curVal)===-1){
  prevVal.push(curVal);
}
return prevVal;
},[]);

// [ 1, 2, 3, 4, 5 ]
  • 求和数组对象某属性

const arr = [{ name: '张三', age: 17 }, { name: '李四', age: 18 }]
const res = arr.reduce((prevVal, curVal, index, arr) => {
  return prevVal + curVal.age;
},0); // 在这里初始值必须有,因第一个元素是对象

// 35
JavaScript中的`reduce`方法是一个强大的数组迭代方法,用于将数组元素归并为单个值。虽然乍一看,与其他JavaScript数组迭代方法(例如`map`和`filter`)相比,`reduce`看起来更复杂,但是一旦了解了语法、核心概念和用例,它就可以成为JavaScript开发人员的另一个强大工具[^2]。以下是关于`reduce`方法的详细使用说明: ### 基本语法 `reduce`方法接受一个回调函数和一个可选的初始值作为参数,其基本语法如下: ```javascript array.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue); ``` - `callback`:必需,用于处理数组中的每个元素的函数,该函数包含四个参数: - `accumulator`:累加器,即上一次调用回调函数的返回值。 - `currentValue`:当前正在处理的数组元素。 - `currentIndex`:当前正在处理的数组元素的索引(可选)。 - `array`:调用`reduce`方法的数组(可选)。 - `initialValue`:可选,作为第一次调用回调函数时的`accumulator`的值。如果没有提供`initialValue`,则使用数组的第一个元素作为`accumulator`的初始值,并且从数组的第二个元素开始执行回调函数。 ### 常见用例 #### 数组元素求和 ```javascript let values = [1, 2, 3, 4, 5]; let sum = values.reduce((prev, cur) => prev + cur); console.log(sum); // 15 ``` 在这个例子中,没有提供初始值,因此`prev`的初始值为数组的第一个元素`1`,然后依次将数组中的其他元素累加到`prev`上,最终得到数组元素的总和`15` [^3]。 #### 数组元素求积 ```javascript function Multiplication(...vals) { return vals.reduce((prev, cur) => prev * cur, 1); } console.log(Multiplication(1, 2, 3, 4, 5)); // 120 ``` 这里提供了初始值`1`,因为乘法的初始值不能为`0`,否则结果将始终为`0`。`prev`的初始值为`1`,然后依次将数组中的元素与`prev`相乘,最终得到数组元素的乘积`120` [^3]。 #### 代替`map`方法 ```javascript const arr = [0, 1, 2, 3]; // 使用map方法 const a = arr.map(v => v * 2); // 使用reduce方法 const b = arr.reduce((prev, v) => [...prev, v * 2], []); console.log(a); // [0, 2, 4, 6] console.log(b); // [0, 2, 4, 6] ``` 在这个例子中,使用`reduce`方法模拟了`map`方法的功能,将数组中的每个元素乘以`2`,并将结果存储在一个新数组中 [^3]。 #### 代替`filter`方法 ```javascript const arr = [0, 1, 2, 3]; // 使用filter方法 const c = arr.filter(v => v > 1); // 使用reduce方法 const d = arr.reduce((prev, cur) => cur > 1 ? [...prev, cur] : prev, []); console.log(c); // [2, 3] console.log(d); // [2, 3] ``` 这里使用`reduce`方法模拟了`filter`方法的功能,过滤出数组中大于`1`的元素,并将结果存储在一个新数组中 [^3]。 #### 同时代替`map`和`filter`方法 ```javascript const arr = [0, 1, 2, 3]; // 使用map和filter方法 const e = arr.map(v => v * 2).filter(v => v > 2); // 使用reduce方法 const f = arr.reduce((prev, cur) => cur * 2 > 2 ? [...prev, cur * 2] : prev, []); console.log(e); // [4, 6] console.log(f); // [4, 6] ``` 此例中,使用`reduce`方法同时模拟了`map`和`filter`方法的功能,先将数组中的元素乘以`2`,然后过滤出大于`2`的元素,并将结果存储在一个新数组中 [^3]。 ### 未设置初始值的情况 ```javascript let arr = [1, 2, 3, 4, 5, 6]; let sum = arr.reduce(function(prev, curr, i, arr) { console.log('prev, curr, i', prev, curr, i); return prev + curr; }); console.log('arr, sum', arr, sum); ``` 当没有设置`initialValue`时,`prev`的初始值为数组的第一个元素,`curr`从数组的第二个元素开始,然后依次进行累加操作 [^5]。 综上所述,`reduce`方法在数组元素求和、数组去重、求数组中的最大值或最小值等很多地方都可以派上用场 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值