一、定义和用法
reduce()
方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
previousValue
:上一次调用callbackFn
时的返回值。在第一次调用时,若指定了初始值initialValue
,其值则为initialValue
,否则为数组索引为 0 的元素array[0]
。currentValue
:数组中正在处理的元素。在第一次调用时,若指定了初始值initialValue
,其值则为数组索引为 0 的元素array[0]
,否则为array[1]
。currentIndex
:数组中正在处理的元素的索引。若指定了初始值initialValue
,则起始索引号为 0,否则从索引 1 起始。array
:用于遍历的数组。
求最大最小值:
let arr1 = [23,123,342,12];
let max = arr1.reduce((pre,cur,index,arr) => {
return pre > cur ? pre : cur
});
console.log(max,"==========")//342
统计一个单词出现的次数:
const arr = ["apple","orange","apple","orange","pear","orange"];
function getWordCnt(){
return arr.reduce(function(pre,cur){
pre[cur] = (pre[cur] + 1) || 1;
return pre;
},{});
}
console.log(getWordCnt());//{apple: 2, orange: 3, pear: 1}
数组去重:
const duplicatedsArr = [1, 5, 6, 5, 7, 1, 6, 8, 9, 7];
const removeDuplicatedArr = duplicatedsArr.reduce((accumulator, currentValue) => {
if(!accumulator.includes(currentValue)){
accumulator.push(currentValue);
}
return accumulator;
}, []);
console.log(removeDuplicatedArr);// [1, 5, 6, 7, 8, 9]
按属性分组对象:
const result = [
{subject: '物理', marks: 41},
{subject: '化学', marks: 59},
{subject: '高等数学', marks: 36},
{subject: '应用数学', marks: 90},
{subject: '英语', marks: 64},
];
let initialValue = {
pass: [],
fail: []
}
const groupedResult = result.reduce((accumulator, current) => {
(current.marks >= 50) ? accumulator.pass.push(current) : accumulator.fail.push(current);
return accumulator;
}, initialValue);
console.log(groupedResult.pass);
//[{ marks: 59, subject: "化学" },{ marks: 90, subject: "应用数学" },{ marks: 64, subject: "英语" }]
数组扁平化:
const twoDArr = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];
const oneDArr = twoDArr.reduce((accumulator, currentValue) => accumulator.concat(currentValue));
console.log(oneDArr);// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
多维数组扁平、、、、、、、、、、、、、、、
let arr = [2,[1,2,[3,4,5],0],9]
function flat(arr){
return arr.reduce((pre,cur)=>{
return pre.concat(Array.isArray(cur)?flat(cur):cur)
},[])
}
console.log(flat(arr))