JS | Reduce
reduce() 方法对数组中的每个元素执行一个自定义的reduce方法(升序执行),将其结果汇总为单个返回值。
语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
callback:执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数
accumulator: 累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue。
currentValue: 数组中正在处理的元素
index(可选): 数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始
array(可选): 调用reduce()的数组initialValue(可选): 作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
练习
对数组的所有值累加
var sum = [0,1,2,3,4].reduce((acc,cur)=>acc+cur,0);
console.log(sum)
//=>10
把二维数组铺平
var arr = [[4,5],[7,8],[78,56]];
var flatArr = arr.reduce((acc,cur) => acc.concat(cur),[])
console.log(flatArr);
//=>[4, 5, 7, 8, 78, 56]
统计数组中相同数值的次数
var nums = ['7','8','4','6','7','8','4','6','9','7','8','9','2','4','7']
var countNum = nums.reduce((acc,cur) => {
cur in acc ? acc[cur]++ : acc[cur]=1;
return acc;
},{})
console.log(countNum);
//=>{2: 1, 4: 3, 6: 2, 7: 4, 8: 3, 9: 2}
对数组的所有对象的值累加
var sum= [{x:1},{x:2},{x:3},{x:4}].reduce((acc,cur) => acc + cur.x,0);
console.log(sum)
//=>10
操作Object,将学生按所属班级分类
var students = [
{name: 'Tom' , class : 1},
{name: 'Gogo' , class : 2},
{name: 'Jany' , class : 1},
{name: 'Jim' , class : 2},
{name: 'Nier' , class: 2}
]
var groupByClass = students.reduce((groupByClass,student)=>{
var classId = student.class;
groupByClass[classId] ? '' :groupByClass[classId] = [];
groupByClass[classId].push(student);
return groupByClass;
},{})
console.log(groupByClass);
//=>{"1":[{"name":"Tom","class":1},{"name":"Jany","class":1}],"2":[{"name":"Gogo","class":2},{"name":"Jim","class":2},{"name":"Nier","class":2}]}