reduce函数的一些使用

本文介绍了JavaScript中reduce方法的使用,通过示例展示了如何按属性对对象数组分类、累加求和以及将二维数组转化为一维。还提供了一个计算数组中元素出现次数的示例,展示了reduce在处理数组数据时的灵活性。
摘要由CSDN通过智能技术生成

reduce() 方法对数组中的每个元素执行一个给定的reducer函数(升序执行),并将其结果累计为单个返回值

reducer 函数接收4个参数:

accumulator (acc) (累计器) : 累计回调的返回值; 它是上一次调用回调时返回的累积值,或着显示提供的 initialValue
currentValue (cur) (当前值)
currentIndex (idx) (当前索引)
sourceArray (src) (源数组)

reducer 函数的返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值

语法:arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

  1. 按属性对object分类
const studentList = [
  { name: 'Zhangsan', age: 21 },
  { name: 'Lisi', age: 20 },
  { name: 'HanMeimei', age: 20 },
  { name: 'XiaoMing', age: 21 }
]

/**
* objectArray 目标对象数组
* property 对象属性
* obj 自定义对象
* acc 累计器累计回调的返回值,它是上一次调用回调时返回的累积值
*/
function groupByProp(objectArray, property) {
  return objectArray.reduce((acc, obj) => {
    let key = obj[property]
    if (!acc[key]) {
      acc[key] = []
    }
    // acc最终是要返回的,因为所有处理的数据都是放到acc中的
    acc[key].push(obj)
    return acc
  }, {}) // {} 表示是initialValue, 则 acc就是这个{}
}

let groupedPeople = groupByProp(studentList, 'age')

/**
	{20: Array(2), 21: Array(2)}
	20: Array(2)
	0: {name: "Lisi", age: 20}
	1: {name: "HanMeimei", age: 20}
	length: 2
	__proto__: Array(0)
	21: Array(2)
	0: {name: "Zhangsan", age: 21}
	1: {name: "XiaoMing", age: 21}
	length: 2
	__proto__: Array(0)
	__proto__: Object
*/
  1. 累加求和
const numArr = [0, 1, 2, 3, 4, 5]
const total = numArr.reduce(function(acc, currVal) {
	return acc + currentIndex
// 这里没有定义初始值,则initialValue是以第一次回调函数执行后返回的值作为acc
})
// 或直接使用箭头函数
const total = numArr.reduce((acc, currVal) => acc + currVal)

3.将二维数组转化为一维

const arr = [
	[{name: 'zhang', age: 20}], 
	[{name: 'lisi', age: 21}], 
	[{name: 'wangwu', age: 22}]
]
const flatArr = arr.reduce((acc, currVal) => {
	return acc.concat(currVal)
}, []) // initialValue为[]
/**
(3) [{…}, {…}, {…}]
0: {name: "zhang", age: 20}
1: {name: "lis", age: 21}
2: {name: "wangwu", age: 22}
length: 3
__proto__: Array(0)
*/
  1. 计算数组中元素出现的次数
const nums = [1, 2, 1, 3, 4, 2, 4, 5, 6]
const countNums = nums.reduce((allNums, num) => {
	if (num in allNums) {
		allNums[num]++
	} else {
		allNums[num] = 1
	}
}, {}) // 这里initialValue是一个{}, 则表示acc就是这个值,这里allNums就是这个{}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值