0


JS操作数组神器——reduce(求和、出现次数、去重、分类)

一、简介

reduce() 对数组每个元素执行一次由您提供的reduce函数(升序执行),将其结果汇总为单个返回值。

循环遍历能做的,reduce都可以做。比如数组根据元素某个属性求和、数组元素出现次数、数组去重、数组根据某个元素属性分类等等。

arr.reduce((prev, cur, index, arr)=>{return prev + cur
},0)

参数介绍

  • prev 必需。累计器累计回调的返回值; 表示上一次调用回调时的返回值,或者初始值 init;
  • cur 必需。表示当前正在处理的数组元素;
  • index 可选。表示当前正在处理的数组元素的索引,若提供 init 值,则起始索引为0,否则起始索引为1;
  • arr 可选。表示原数组;
  • init 可选。表示初始值。

以下为有无 init 的区别
演示代码

console.log('-------有init---------')const arr =[1,2,3,4,5]const sum = arr.reduce((prev, cur, index, arr)=>{
  console.log(prev, cur, index, arr)return prev + cur
},0)
console.log(arr, sum)

console.log('-------无init---------')const arr2 =[1,2,3,4,5]const sum2 = arr.reduce((prev, cur, index, arr)=>{
  console.log(prev, cur, index, arr)return prev + cur
})
console.log(arr2, sum2)

输出结果

-------有init---------010[1,2,3,4,5]121[1,2,3,4,5]332[1,2,3,4,5]643[1,2,3,4,5]1054[1,2,3,4,5][1,2,3,4,5]15-------无init---------121[1,2,3,4,5]332[1,2,3,4,5]643[1,2,3,4,5]1054[1,2,3,4,5][1,2,3,4,5]15

二、求和

假如我们想把对商品的价格进行求和
演示代码

// 根据数组对象某个属性求和const shopList =[{
    id:1,
    name:'苹果',
    isDeleted:false,
    num:2,
    price:5999},{
    id:2,
    name:'小米',
    isDeleted:false,
    num:1,
    price:3999},{
    id:3,
    name:'华为',
    isDeleted:true,
    num:3,
    price:4999}]

let shopListSum = shopList.reduce((prev, item)=>{
  prev += item.num * item.price
  return prev
},0)
console.log(shopListSum)

输出结果

30994

三、出现次数

假如我们想计算每件商品的搜索次数
演示代码

// 计算数组元素次数const nameList =['xiaomi','huawei', 'pingguo', 'xiaomi', 'huawei', 'huawei']
let countedNameObj = nameList.reduce((prev, item)=>{if(item in prev){
    prev[item]++}else{
    prev[item]=1}return prev
},{})
console.log(countedNameObj)

输出结果

{ xiaomi:2, huawei:3, pingguo:1}

四、去重

可分为直接去重和排序后去重

1.直接去重
演示代码

const nameList =['xiaomi','huawei', 'pingguo', 'xiaomi', 'huawei', 'huawei']
let newNameList = nameList.reduce((prev, item)=>{if(prev.indexOf(item)===-1){
    prev.push(item)}return prev
},[])
console.log(newNameList)

输出结果

['xiaomi','huawei', 'pingguo' ]

2.排序后去重
演示代码

const numList =[1,4,5,5,7,5,8,1,2,3,4,5,9,1,2]
let newNumList = numList.sort().reduce((prev, item)=>{if(prev.length ===0|| prev[prev.length -1]!== item){
    prev.push(item)}return prev
},[])
console.log(newNumList)

输出结果

[1,2,3,4,5,7,8,9]

五、分类

假如我们想把商品数组里面上架和未上架的商品分类
演示代码

// 根据数组对象某个属性分类const shopList =[{
    id:1,
    name:'苹果',
    isDeleted:false},{
    id:2,
    name:'小米',
    isDeleted:false},{
    id:3,
    name:'华为',
    isDeleted:true}]

function groupBy(list, pros){return list.reduce((prev, item)=>{
    let key = item[pros]if(!prev[key]){
      prev[key]=[]}
    prev[key].push(item)return prev
  },{})}

let myShopList =groupBy(shopList, 'isDeleted')
console.log(myShopList)

输出结果

{false:[{ id:1, name:'苹果', isDeleted:false},{ id:2, name:'小米', isDeleted:false}],true:[{ id:3, name:'华为', isDeleted:true}]}
标签: javascript 前端

本文转载自: https://blog.csdn.net/qq_33591873/article/details/125248005
版权归原作者 bei-zhen 所有, 如有侵权,请联系我们删除。

“JS操作数组神器——reduce(求和、出现次数、去重、分类)”的评论:

还没有评论