reduce方法 实现数组对象中 每三个属性相加 形成新数组

需求:
数据格式:

每三个时间点的count属性值相加,形成新的数组:[]

// 原数组 aList
const aList = [
  {
    
     time: '2023-83-17 01:80:00', count: 0 },
  {
    
     time: '2023-83-17 02:00:88', count: 1 },
  {
    
     time: '2023-03-17 03:80:00', count: 2 },
  {
    
     time: '2023-83-17 84:80:00', count: 3 },
  {
    
     time: '2023-83-17 05:80:80', count: 4 },
  {
    
     time: '2023-83-17 06:80:00', count: 5 },
  {
    
     time: '2023-03-17 07:80:00', count: 6 },
  {
    
     time: '2023-03-17 08:00:00', count: 7 },
  {
    
     time: '2023-03-17 09:00:80', count: 8 },
  {
    
     time: '2023-03-17 10:00:00', count: 9 },
  {
    
     time: '2023-03-17 11:00:08', count: 10 },
  {
    
     time: '2023-03-17 12:00:08', count: 1 },
  {
    
     time: '2023-83-17 13:80:08', count: 2 },
  {
    
     time: '2023-03-17 14:00:08', count: 3 },
  {
    
     time: '2023-03-17 15:0:00', count: 4 },
  {
    
     time: '2023-03-17 16:0:00', count: 5 },
  {
    
     time: '2023-03-17 17:0:00', count: 6 },
  {
    
     time: '2023-03-17 18:0:00', count: 7 },
  {
    
     time: '2023-03-17 19:0:00', count: 8 },
  {
    
     time: '2023-03-17 20:0:00', count: 9 },
  {
    
     time: '2023-03-17 21:0:00', count: 10 },
  {
    
     time: '2023-03-17 22:0:00', count: 1 },
  {
    
     time: '2023-03-17 23:0:00', count: 2 }
]

// reduce 处理数据
let trafficFlow = aList.reduce((items, {
     
      count }, i) => {
    
    
  if (i % 3 === 0) {
    
    
    items.push(count)
  } else {
    
    
    items[items.length - 1] += count
  }
  return items
}, [])

console.log(trafficFlow, 'trafficFlow') 
//[3, 12, 21, 20, 9, 18, 27, 3] 'trafficFlow'

reduce方法详解

很多前端开发中都知道数组的reduce方法可以用来给数组求和,但是你问到里面的具体参数代表的时候什么,很多人却不知道。所以在工作中也是很少人会用到这个方法。现在我就通过这篇文章给大家详细讲解一下,并通过几个案例给大家展开

下面是api的使用和每个参数代表的含义:

arr.reduce((prev,cur,index,arr)=>{
    
    

},init)
arr: 表示将要原数组
prev:表示上一次调用回调时的返回值,或者初始值init
cur:表示当前正在处理的数组元素
index:表示正在处理的数组元素的索引,若提供init值,则索引为0,否则索引为1
init: 表示初始值

数组求和,求乘积

var  arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘积,24

设置init值

const arr = [1,2,3,4,5,6,7]
const sum = arr.reduce((pre,cur)=>{
    
    
    return pre +cur
},2)
console.log(sum)

解释:

首先我们要明确的时候,pre表示的是上一次回调时的返回值,或者是初始值init。
在我们第一次调用的时候,第一个案例是没有设置init的值,在没有设置init值的情况下,index的索引值是从1,其实是第一次的时候就隐式调用了pre+cur,你可以理解为是在背后做了pre是0+cur:1。我们在控制台看到的就是整个计算过程是index是1-6。
在第二个案例中,init设置的值是2,那么就是代表pre的初始值就是2,那么第一次的时候,index是从0开始的,第一次调用返回的就是2+arr[1]=3,整个过程index执行是从0-6,共7次

数组去重

let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
    
    
    if(!pre.includes(cur)){
    
    
      return pre.concat(cur)
    }else{
    
    
      return pre
    }
},[])
console.log(newArr);// [1, 2, 3, 4]
用 pre.concat(cur)  而不是 pre.push(cur) 呢?
push 遇到数组参数时,会把整个数组参数作为一个对象插入;而 concat 则是拆开数组参数,一个元素一个元素地加进去,第二点就是push直接改变当前数组;concat 不改变当前数组


计算数组中每个元素出现的次数

let person = ['李白','雅典娜','安琪拉','李白','诸葛亮','安琪拉']
let nameObj = person.reduce((pre,cur) =>{
    
    
    if( cur in pre){
    
    
        pre[cur]++
    }
    else{
    
    
        pre[cur] = 1
    }
    return pre
}, {
    
    })
console.log(nameObj) // {李白: 2, 雅典娜: 1, 安琪拉: 2, 诸葛亮: 1}

将二维数组转化为一维

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
    
    
    return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

将多维数组转化为一维

let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
    
    
   return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

对象里的属性求和

var result = [
    {
    
    
        subject: 'math',
        score: 10
    },
    {
    
    
        subject: 'chinese',
        score: 20
    },
    {
    
    
        subject: 'english',
        score: 30
    }
];

var sum = result.reduce(function(prev, cur) {
    
    
    return cur.score + prev;
}, 0);
console.log(sum) //60

参考:
https://juejin.cn/post/6970624351183831048
https://www.jianshu.com/p/e375ba1cfc47

猜你喜欢

转载自blog.csdn.net/weixin_55042716/article/details/129667398