js reduce()方法的基本使用

 最基本简单的使用 => 求和、相乘:

let arr = [1,2,3,4,5]
let sum =  arr.reduce(function(prev, cur, index, arr) {
  console.log('prev', prev, 'cur', cur, 'index', index);
  return prev + cur
})
console.log('arr', arr, 'sum', sum);
// prev 1 cur 2 index 1
// prev 3 cur 3 index 2
// prev 6 cur 4 index 3
// prev 10 cur 5 index 4
// arr (5) [1, 2, 3, 4, 5]0: 11: 22: 33: 44: 5length: 5[[Prototype]]: Array(0) sum 15
let arr2 = [1, 2, 3, 4, 10]
let sum2 = arr2.reduce((x, y) => {
  console.log('x: ', x, 'y: ', y);
  return x + y
})
// x:  1 y:  2
// x:  3 y:  3
// x:  6 y:  4
// x:  10 y:  10
// sum2:  20
console.log('sum2: ', sum2);  // 20
let mul = arr2.reduce((x, y) => {
  console.log('x: ', x, 'y: ', y);
  return x * y;
})
// // x:  1 y:  2
// // x:  2 y:  3
// // x:  6 y:  4
// // x:  24 y:  10
// // mul 240
console.log('mul', mul); // 240

小结1:

    // let arr = [1,2,3,4,5]

    // let sum =  arr.reduce(function(prev, cur, index, arr) {

    //   console.log('prev', prev, 'cur', cur, 'index', index);

    //   return prev + cur

    // })

    第一个参数 prev(必需):上一次调用回调返回的值,第一次初始值是数组的第一项。如上述例子,prev就是1,第二次就是 prev + cur 的结果;

    第二个参数 cur(必需):当前数组中被处理的元素,第一次是数组的第二项。如上述例子,cur是 2,第二次就是 3;

    第三个参数 index(可选):当前被处理元素在数组中的索引。如上述例子,index第一次是 1,第二次是 2;

    第四个参数 arr(可选):调用 reduce()方法的数组。如上述例子,arr就是 [1, 2, 3, 4, 5]。

    let arr2 = [1, 2, 3, 4, 10]

    1、eg1:

    let sum2 = arr2.reduce((x, y) => {

      console.log('x: ', x, 'y: ', y);

      return x + y

    })

      第一次    x:  1 y:  2

      第二次    x:  3 y:  3

      第三次    x:  6 y:  4

      第四次    x:  10 y:  10

    运行结果是最后一次循环的x 和 y 的值相加;  sum2 为 20

    2、eg2:

    let mul = arr2.reduce((x, y) => {

      console.log('x: ', x, 'y: ', y);

      return x * y;

    })

      第一次    x:  1 y:  2

      第二次    x:  2 y:  3

      第三次    x:  6 y:  4

      第四次    x:  24 y:  10

    运行结果是最后一次循环的x 和 y 的值相乘;  mul 为 240

    注意:reduce() 方法接收一个函数作为累加器,数组中的每个元素(从左到右)将有该函数执行一次。

    累加器初始值为函数的第一个参数,然后将每个元素作为参数调用该函数,最后返回累加器的最终值。

reduce的其他应用

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

let fruits = ['apple', 'orange', 'banana', 'orange', 'grape', 'persimmon']
let result = fruits.reduce((prev, cur) => {
  //prev:累加器的当前值,在第一次调用时等同于提供的初始值(在这里是一个空对象)。
  // cur:数组中正在处理的当前元素。
  if (cur in prev) {  // 如果当前元素 cur 作为键存在于累加器对象 prev 中,就将其对应的值增加 1。这用于统计数组中每个元素出现的次数。
    prev[cur]++  
  } else {  // 如果 cur 不存在于 prev 对象中,就在 prev 对象中以 cur 为键创建一个新属性,并将值设置为 1。这表示该元素在数组中首次出现。
    prev[cur] = 1    
  }
  return prev
}, {})
console.log('新组合', result);  // {apple: 1, orange: 2, banana: 1, grape: 1, persimmon: 1}

  // 1. 由于设置了迭代初始值,p个re的第一个值是一空对象,此时name为Alice,然后进行判断,发现在pre中没有Alice属性,所以就将Alice对应的属性值赋为1。

  // 2. 后面没有重复的是一样的道理,如果碰到重复值,就会将该属性值加1,这样就能计算元素重复的次数了。

  // console.log('prev', prev);  // {}

2、 数组去重

let arr2 = [1,2, 3, 5, 3, 2, 3, 4, 5]
let newArr = arr2.reduce((prev, cur) =>{
  console.log('prev', prev); //没有return时,第一次是 [],后面都是undefined
  if(!prev.includes(cur)) {
    return prev.concat(cur)
  }else {
    return prev
  }
}, [])
console.log('newArr', newArr);
// prev []
// prev [1]
// prev (2) [1, 2]
// prev (3) [1, 2, 3]
// prev (4) [1, 2, 3, 5]
// prev (4) [1, 2, 3, 5]
// prev (4) [1, 2, 3, 5]
// prev (4) [1, 2, 3, 5]
// prev (5) [1, 2, 3, 5, 4]
// newArr (5) [1, 2, 3, 5, 4]

3、将二维数组转成一维数组

let arr3 = [[1, 2], [3, 4], [5, 6]]
let newArr3 = arr3.reduce((prev, cur) => {
  // console.log('prev3',prev);
  return prev.concat(cur)
}, [])
console.log('newArr3',newArr3); // newArr3 (6) [1, 2, 3, 4, 5, 6]

4、将多维数组转成一维数组 

let arr4 = [[1, 2], [3, 4], [5, 6,[7,8,9]]]
let newArr4 = (arr4) => {
  return arr4.reduce((prev, cur) => prev.concat(Array.isArray(cur) ? newArr4(cur) : cur), [])
}
console.log('newArr4', newArr4(arr4));  // newArr4 (9) [1, 2, 3, 4, 5, 6, 7, 8, 9]

 5、对象里的属性求和

let arr5 = [
  {name: 'Alice', age: 20},
  {name: 'Bob', age: 25},
  {name: 'Charlie', age: 30}
]
let sum5 = arr5.reduce((prev, cur) => {
  return prev + cur.age
}, 0)
console.log('sum5', sum5);  // sum5 75

6、按属性对Object分类

let arr6 = [
  {name: 'Alice', age: 20, gender:'male'},
  {name: 'Bob', age: 25, gender:'male'},
  {name: 'Charlie', age: 30, gender: 'female'},
  {name: 'David', age: 35, gender: 'female'}
]
const groupBy = (arr, prop) => {
  return arr.reduce((prev, cur) => {
    let key = cur[prop]
    // console.log('key: ', key);  // 2 key:  male   2 key:  female
    // console.log('prev[key]', prev[key]);
    if(!prev[key]) {
      prev[key] = []
    }
    prev[key].push(cur)
    return prev
  }, {})
}
let groupedArr = groupBy(arr6, 'gender')
console.log('groupedArr', groupedArr);  // {male: Array(2), female: Array(2)}
// 运行结果:
// groupedArr 
// {male: Array(2), female: Array(2)}
// female
// : 
// (2) [{…}, {…}]
// male
// : 
// (2) [{…}, {…}]

注:后面有新的应用会push上来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值