javaScript--数组(Array)的reduce方法解析

概述:javaScript中Array中不止reduce方法,还包含foreach,map,filter等等,这里主要介绍是reduce方法。

reduce()从左到右累计数据,直到最后为一个值(也就是最终的结果),听起来还是比较抽象的,累计注意可以是数据,也是字符串编辑

1.语法:

arr.reduce(callback, [initialValue])

  参数解析:

  arr:表示要累计的数组

  callback:回调函数(也就是你要对数组怎么处理)

回调函数中有四个参数:

accumulator:累计结果,最近一次回调产生结果,或者是初始值(如果提供的话)

currentValue:当前值,也就是进行处理的下一个值

currentIndex:表示当前值的索引(从0开始),如果有初始值提供的索引为1

array:需要累计数组

  initialValue:初始值(可选参数)如果提供就是第一次回调的第一个参数(accumulator),没有提供就取数组第一个元素,如果既没有提供初始化参数又是个空数组就会抛出异常

2.描述:

  如果第一次回调传入初始值,那么accumulator就是初始值,而currentValue就是数组的第一个值,如果没有提供初始值,那么accumulator将会取数组第一个值,currentValue当然是第二个值

  如果数组是空,而有没有初始化值,将会抛出TypeError(类型异常),如果数组是空,而传入初始值 或者 没有传入初始值,数组只有一个元素,那个不会调用回调函数,直接返回这个元素的值或者是初始值


//这些是arrow function(箭头函数)
var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
var maxCallback2 = ( max, cur ) => Math.max( max, cur );

// 调用reduce方法没有传入初始值
[ { x: 22 }, { x: 42 } ].reduce( maxCallback ); // 结果为42
[ { x: 22 }            ].reduce( maxCallback ); // 结果为:{ x: 22 }
[                      ].reduce( maxCallback ); // 抛出异常 TypeError

// 数组map进行遍历的到x对应的数字(预先处理一步),再回调
[ { x: 22 }, { x: 42 } ].map( el => el.x )
                        .reduce( maxCallback2, -Infinity );

3.reduce()具体的工作过程

以下为例
[0, 1, 2, 3, 4].reduce(
  function (
    accumulator,
    currentValue,
    currentIndex,
        array
 ) { return accumulator + currentValue; });
具体回调请如下表(没有传入初始值)
回调累计值当前值当前索引数组返回值
第一次011[0,1,2,3,4]
1
第二次122[0,1,2,3,4]
3
第三次333[0,1,2,3,4]
6
第四次644[0,1,2,3,4]
10

也可以用箭头函数表示:
[0,1,2,3,4].reduce((prev, curr)=> prev + curr );
对于传入初始化值情况
[0, 1, 2, 3, 4].reduce(
  (accumulator, currentValue, currentIndex, array) => {
    return accumulator + currentValue;
  },
  10
);
传入初始值为10,返回20
回调累计值当前值当前索引数组返回值
第一次1000[0,1,2,3,4]10
第二次1011[0,1,2,3,4]
11
第三次1122[0,1,2,3,4]
13
第四次1333[0,1,2,3,4]
16
第五次1644[0,1,2,3,4]
20

4.例子走起

a.累加
var sum = [0, 1, 2, 3].reduce(function (a, b) {
  return a + b;
}, 0);
// sum is 6
可以用箭头函数
var total = [ 0, 1, 2, 3 ].reduce(
  ( acc, cur ) => acc + cur,
  0
);
b.拼接字符串
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
  function(a, b) {
    return a.concat(b);
  },
  []
);
// 拼接的结果为 [0, 1, 2, 3, 4, 5]
可用箭头函数
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
  ( acc, cur ) => acc.concat(cur),
  []
);
c.字段计数

var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
var countedNames = names.reduce(function (allNames, name) { 
  if (name in allNames) {
    //对应name字段累计1
    allNames[name]++;
  }
  else {
    //新建一个name字段数字为1
    allNames[name] = 1;
  }
  return allNames;
}, {});
console.log(countedNames);
// countedNames 的结果为:
// { 'Alice': 2, 'Bob': 1, 'Tiff': 1, 'Bruce': 1 }
d.继续扩展
// friends -y一个数组对象
// 对象中字段books表示所有喜欢的书
var friends = [{
  name: 'Anna',
  books: ['Bible', 'Harry Potter'],
  age: 21
}, {
  name: 'Bob',
  books: ['War and peace', 'Romeo and Juliet'],
  age: 26
}, {
  name: 'Alice',
  books: ['The Lord of the Rings', 'The Shining'],
  age: 18
}];

// 列出所有朋友喜欢的书+初始值的书
var allbooks = friends.reduce(function(prev, curr) {
  //称为rest 参数,详情参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters
  return [...prev, ...curr.books];
}, ['Alphabet']);
//结果为:
// allbooks = [
//   'Alphabet', 'Bible', 'Harry Potter', 'War and peace', 
//   'Romeo and Juliet', 'The Lord of the Rings',
//   'The Shining'
// ]

5.浏览器兼容情况 最低版本

Chrome 支持, firefox 3.0(1.9),
  IE 9 , Opera 10.5 , Safari 4.0
总结:
reduce()功能还是很强大的,主要累计操作,累加或拼接等等,只要是积累操作都可以考虑用reduce。
本文参考官方文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce?v=control


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript数组方法reduce()是用于对数组中的元素进行累积计算的方法。它接受一个回调函数作为参数,该回调函数可以定义两个参数:累积器和当前值。reduce()方法遍历数组的所有元素,并将每个元素传递给回调函数进行累积计算。最后,它返回一个累积的结果。 在引用中的示例中,我们可以看到使用reduce()方法来计算数组的和和乘积。通过传递一个回调函数给reduce()方法,在每次迭代中将上一个值与当前值相加或相乘,最终得到累积的和和乘积。 需要注意的是,如果数组是空的,使用reduce()方法会报错。如引用所示,对于空数组reduce()方法需要传入一个初始值作为累积器的初始值,否则会抛出"TypeError: Reduce of empty array with no initial value"的错误。 最后,reduce()方法的语法是array.reduce(function(total, currentValue, currentIndex, arr), initialValue)。其中,total是累积器的初始值或上一次回调函数的返回值,currentValue是当前元素的值,currentIndex是当前元素的索引,arr是原始数组。initialValue是可选的,用于设置累积器的初始值,如果不传递该参数,则默认使用数组的第一个元素作为初始值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [JavaScript数组reduce()方法详解及奇淫技巧](https://blog.csdn.net/saucxs/article/details/91045557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [JS数组reduce()方法详解](https://blog.csdn.net/weixin_47619284/article/details/125921346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值