reduce函数的妙用

264 阅读2分钟

简介

reduce()  方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。简单来说有汇总的功能,ES6新增数组函数当中,reduce无疑是最强大的一个函数,掌握好可以在日常工作中节省很多无用功。

reduce函数的参数:

  • currentValue (cur) (当前值)
  • previousValue(pre) (上一次汇总值,当存在initialValue的时候,第一次执行pre为initialValue,不存在initialValue的时候,第一次执行为数组的第一个元素)===>reduce函数的核心
  • initialValue (初始值)

语法

arr.reduce(callback(previousValue, currentValue[, index[, array]])[, initialValue])

基本用法1(求和)

const reducer = (previousValue, currentValue) => previousValue + currentValue;

console.log(array1.reduce((previousValue, currentValue) => previousValue + currentValue));
//由于没有初始值initialValue,所以第一次previousValue为数组第一个元素,后面遍历累加
// 1 + 2 + 3 + 4
//  output: 10

// 5 + 1 + 2 + 3 + 4
console.log(array1.reduce((previousValue, currentValue) => previousValue + currentValue),5);
//由于有初始值initialValue,所以第一次previousValue为初始值5,后面遍历累加
//  output: 15


基本用法2(累加对象数组里的值)

要累加对象数组中包含的值,必须提供初始值,以便各个item正确通过你的函数,项目中对多项数据求个和还是比for方便多了

var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(function (pre, cur) {
    return pre + cur.x;
},initialValue)

console.log(sum) //  6

进阶用法1(二维数组转一维数组)

let flatArr = [[0, 1], [2, 3], [4, 5]].reduce(
  function(prev, cur) {
    return prev.concat(cur);
  },
  []
);
//output:[0,1,2,3,4,5]

进阶用法2(计算数组中每个元素出现的次数)

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

var countedNames = names.reduce(function (prev, cur) {
  if (cur in prev) {
    prev[cur]++;
  }
  else {
    prev[cur] = 1;
  }
  return prev;
}, {});
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }

进阶用法3(数组去重)

面试碰到去重使用这种方法,还能给面试官不错的印象

let myArray = ['a', 'b', 'a', 'b', 'c', 'e', 'e', 'c', 'd', 'd', 'd', 'd']
let myOrderedArray = myArray.reduce(function (prev, cur) {
  if (prev.indexOf(cur) === -1) {
    prev.push(cur)
  }
  return prev
}, [])

console.log(myOrderedArray)

进阶用法4(字符串表达式在对象中查找值)

用过vue的知道,我们{{a.b.c.d}}能访问到实例身上的嵌套对象层级属性,接下来使用reduce实现一下这个功能

//基本的
   let obj = {
            a: {
                b: {
                    c: {
                        d: 12
                    }
                }
            }
        }
        console.log(obj.a.b.c.d)//12显然没毛病
          console.log(obj["a.b.c.d"])//undefined 显然是.不能被识别整个字符串北当成了一个整体 
//reduce版本
    let str = "a.b.c.d"
        let arrSplitDotted = str.split(".")
        let res = arrSplitDotted.reduce((prev, cur) => {
            return prev[cur]
        }, obj)
        console.log(res)

mdn介绍地址:

developer.mozilla.org/zhCN/docs/W…

好了,这就是reduce几种比较实用的使用方法,有用记得收藏关注哦!!