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

这篇具有很好参考价值的文章主要介绍了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---------
0 1 0 [ 1, 2, 3, 4, 5 ]
1 2 1 [ 1, 2, 3, 4, 5 ]
3 3 2 [ 1, 2, 3, 4, 5 ]
6 4 3 [ 1, 2, 3, 4, 5 ]
10 5 4 [ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ] 15
-------无init---------
1 2 1 [ 1, 2, 3, 4, 5 ]
3 3 2 [ 1, 2, 3, 4, 5 ]
6 4 3 [ 1, 2, 3, 4, 5 ]
10 5 4 [ 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)

输出结果文章来源地址https://www.toymoban.com/news/detail-425340.html

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

到了这里,关于JS操作数组神器——reduce(求和、出现次数、去重、分类)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS数组求和的几种方法

    这篇文章主要介绍了JS数组求和的几种常用方法 方法一:通过原型对象扩展内置对象方法(即给Array增加方法) 方法二:普通for循环函数求和 方法三:使用递归 方法四:函数式编程reduce 拓展:注意reduce()方法的最后一个参数(下面是个特例),避坑!!! 方法五:forEach遍历

    2024年02月01日
    浏览(47)
  • 剑指offer39.数组中出现次数超过一半的数字

    这个题非常简单,解法有很多种,我用的是HashMap记录每个元素出现的次数,只要次数大于数组长度的一半就返回。下面是我的代码: 题解还有一种更牛逼的解法,把数组排序,然后返回数组中间的那个数就行,因为如果这个数出现的次数大于数组长度的一半的话,排完序后

    2024年02月13日
    浏览(37)
  • 剑指 Offer 39.数组中出现次数超过一半的数字

    剑指 Offer 39.数组中出现次数超过一半的数字 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums = [3,2,3] 输出:3 示例 2: 输入:n

    2024年01月21日
    浏览(39)
  • 剑指 Offer 39. 数组中出现次数超过一半的数字

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸剑指 Offer  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸

    2024年02月07日
    浏览(44)
  • 剑指 Offer 56 - I. 数组中数字出现的次数

    理想的人物不仅要在物质需要的满足上,还要在精神旨趣的满足上得到表现。        —— 黑格尔 目录 方法1:排序+指针 方法2:异或整个数组 题目: 一个整型数组  nums  里除两个数字之外,其他数字都出现了 两次 。请写程序找出这两个 只出现一次的数字。 要求时间复

    2023年04月16日
    浏览(37)
  • (数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】

    难度:简单 给你一个整数数组 arr ,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true ;否则返回 false 。 示例 1: 输入:arr = [1,2,2,1,1,3] 输出:true 解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出

    2024年02月08日
    浏览(42)
  • 每日一题——LeetCode1287.有序数组中出现次数超过25%的元素

    方法一 一次循环统计 题目给出的数据相同的元素都是相邻的,那么直接从头开始遍历,统计每种元素出现次数,当有元素次数超过arr.length/4即为要求的元素   消耗时间和内存情况: 方法二 方法一简化版 设步长step=arr.length/4,如果某个元素arr[i],跨越一个步长后arr[i+step],即

    2024年01月22日
    浏览(52)
  • JS数组去重的12种方法

    Set 对象是 ES6 中新定义的数据结构,类似数组,它允许存储任何类型的唯一值,不管是原始值还是对象引用。 Array.from() 方法 就是将一个类数组对象或者可遍历对象转换成一个真正的数组 不考虑兼容性,这种去重的方式代码最少。这种方法无法去掉 {} 空对象,后面的高阶方

    2024年02月06日
    浏览(39)
  • Js:获取数组对象重复属性值和数组对象去重

    对象数组去重分为两类:根据某一属性去重,和去重完全相同对象(属性属性值都相同) 一.数组嵌套对象,根据对象某一属性去重 二、数组嵌套对象,去重完全相同对象(属性属性值都相同) 整理如下: 首先、循环数组,拿到对象的所有属性组成的数组; 其次、循环属性

    2024年01月21日
    浏览(52)
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II(位运算 / 哈希表 / 排序)

    链接:剑指 Offer 56 - II. 数组中数字出现的次数 II 难度:中等 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 示例 1: 输入:nums = [3,4,3,3] 输出:4 示例 2: 输入:nums = [9,1,7,9,7,9,7] 输出:1 限制: 1 = nums.length = 10000 1

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包