reduce()的使用

概述:

reduce()是ECMAScript为数组提供的归并方法,该方法会迭代数组的所有项,并构建一个最终返回值

  • 接收参数: 一个函数、可选的归并起点值
  • 第一个参数作为函数可以接收四个值: 上一个归并值、当前值、当前项的索引、数组本身

基本使用(取得数组各项的值并进行累加操作或阶乘):

const arr = [1, 2, 3, 4, 5, 3, 4, 5 ,6 ,7 , 7]
    var sum = arr.reduce((pre, cur, index, array) => {
      console.log(pre, cur, index);
      return pre + cur
    })
    console.log(sum); //47,数组所有项的和,最后一项归并值

打印结果:


进阶用法

  • 数组去重

思路:

  1. 设定初始归并值为空数组,用于接收去重后的数组;
  2. 将待去重的数组的每一项迭代【即cur】通过concat(cur)方法添加至副本【初始归并值pre】末尾
  3. 通过搜索方法includes()判断当前项是否存在于归并数组中,存在时,直接对归并值返回,反之,将当前迭代值通过concat()方法添加到数组末尾
const arr = [1, 2, 3, 4, 5, 3, 4, 5 ,6 ,7 , 7]
var sum2 = arr.reduce((pre, cur, index, arr) => {
      if (!pre.includes(cur)) {
        return pre.concat(cur)
      }else {
        return pre
      }
    }, [])
    console.log(sum2);//[1, 2, 3, 4, 5, 6, 7]
  • 统计数组相同项出现的次数

思路:
1.设定初始归并值为空对象,对象属性为数组项的值,对象属性值存放相同数组项出现的次数;

  1. 通过in操作符来判断以数组项值为名的属性是否存在于对象中,存在的话,将以该数组项值为属性名的属性值进行+1操作,否则,说明该数组项第一次出现,将代表出现次数的属性值设定为1
// 计算数组中每个元素出现的次数
    const names = ['孙悟空', '猪八戒', '沙和尚', '唐僧', '孙悟空', '猪八戒']

    let sum1 = names.reduce((pre, cur, index, array) => {
      if ( cur in pre ) {
        pre[cur]++
      }else {
        pre[cur] = 1
      }
      return pre
    }, {})
    console.log(sum1);//{孙悟空: 2, 猪八戒: 2, 沙和尚: 1, 唐僧: 1}
  • 二维数组转为一维数组
const arr1 = [[1, 2], [2, 3], [4, 5]]

    let arr_1 = arr1.reduce((pre, cur, index, arr) => {
      pre = pre.concat(cur)
      return pre
    }, [])
    console.log(arr_1);
  • 操作对象
const books = [
      {name: '解构现代化', price: 34, author: '温铁军'},
      {name: '去依附', price: 26, author: '温铁军'},
      {name: '八次危机', price: 30, author: '温铁军'},
      {name: '百年孤独', price: 46, author: '加西亚.马尔克斯'},
      {name: '霍乱时期的爱情', price: 28, author: '加西亚.马尔克斯'},
      {name: '三体', price: 58, author: '刘慈欣'}
    ]
    // 需求1--求所有书籍的总价格
    var price_sum = books.reduce((pre, cur, index, array) => {
      return pre += cur.price;
    }, 0)
    console.log(price_sum);
    
    // 需求2--求温铁军的书籍的总价格
    var wen_price_sum = books.reduce((pre, cur, index, array) => {
      if (cur.author === '温铁军') {
        pre += cur.price
      }
      return pre
    }, 0)
    console.log(wen_price_sum);

    // 需求3--求温铁军书籍的平均价格
    var wen_price_aver = books.reduce((pre, cur, index, array) => {
      if (cur.author === '温铁军') {
        pre.name = "温铁军",
        pre.total += cur.price
        pre.count ++
      }
      return pre
    }, {name: '', total: 0, count: 0})


    console.log(wen_price_aver);
    console.log(wen_price_aver.total/wen_price_aver.count);
// 求所有作者书的平均价格
    var all_price_aver = books.reduce((pre, cur, index, array) => {
      // 当归并对象内不存在该属性时,对该属性进行初始化,纪录作者名、总量、出现次数
      if (!pre[cur.author]) {
        pre[cur.author] = {
          name: cur.author,
          total: 0,
          count: 0
        }
      }
      // 对价格进行累加操作
      pre[cur.author].total += cur.price
      // 用对象属性纪录当前项出现次数
      pre[cur.author].count++

      return pre
    }, {})

    console.log(all_price_aver);
    var mylist = Object.values(all_price_aver)
    console.log(mylist);
    // 接收包含作者及价格平均值的对象
    const obj = {}
    // 遍历数组,将数组各需要项赋值给接收对象【作者名为属性名, 平均值为属性值】
    var mysum = mylist.forEach((item) => {
      console.log(item);
      obj[item.name] = item.total/item.count
    })

    console.log(obj);//{温铁军: 30, 加西亚.马尔克斯: 37, 刘慈欣: 58}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351