js中数组reduce的使用原来这么简单
reduce 的学习方法
array.reduce(callback(prev, currentValue, index, arr), initialValue)
//简写就是下面这样的
arr.reduce(callback,[initialValue])
callback (执行数组中每个值的函数,包含四个参数)
1、prev (上一次回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
需要注意的是 initialValue的值是任意的哈。可以是数组可以是对象。
简单使用 reduce
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
console.log(arr, sum);
//打印结果:
//1 2 1
//3 3 2
//6 4 3
//[1, 2, 3, 4] 10
分析上面这个案例
这里可以看出,上面的例子index是从1开始的。
第一次的prev的值是上一次回调返回的值,或者是提供的初始值。
或者是数组的第一项的值。
因此第二次的 prev 是3=1+2(上一次回调返回的值 prev + cur)
因此第三次的 prev 是6=1+2(上一次回调返回的值 3 + 3)
我们发现数组长度是4,但是reduce函数循环3次。
说明reduce是从索引index为是从1开始循环的。
reduce 第二个参数提供初始值
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
}, 10)
console.log(arr, sum);
//打印结果:
// 10 1 0
// 11 2 1
// 13 3 2
// 16 4 3
// [1, 2, 3, 4] 20
分析第二个参数提供初始值
前端我们说了:prev (上一次回调返回的值,或者是提供的初始值(initialValue))
因为提供了初始值,所以第一次是10,
当前值就变为了1,索引就从0开始了。
因此第一次的值是 10 1 0
第二次prev (上一次回调返回的值)11=10+1
第三次prev (上一次回调返回的值)13=13+3
数组为空,运用reduce是什么情况
var arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
console.log(arr, sum);
//报错: Reduce of empty array with no initial value at Array.reduce (<anonymous>)
如果我们设置了初始值呢?
var arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index); //这一条语句不
return prev + cur;
}, 10)
console.log(arr, sum); //[] 10
reduce的累加,累乘
// 累加
let sum = [1, 2, 3, 4, 5].reduce((prev, cur) => prev + cur);
console.log(sum) //输出15
let sum = [1, 2, 3, 4, 5].reduce((prev,cur) => prev * cur);
console.log(sum) //输出120
let sum = [1, 2, 3, 4, 5].reduce((prev, cur) => prev * cur, 10);
console.log(sum) //输出1200
reduce数组对象求和
let arr = [{
money: 100,
name: '苹果'
}, {
money: 50,
name: '香蕉'
}]
不使用初始值
function sum(arr) {
return arr.reduce((prev, cur) => {
return prev.money + cur.money
})
}
使用初始值
function sum(arr) {
return arr.reduce((prev, cur) => {
return cur.money + prev
}, 0)
}
console.log(sum(arr)) //输出150
reduce计算数组中每个元素出现的次数[面试经常问]
let names = ['yes', 'hello', 'hi', 'yes', 'yy'];
// 第二个初始值是一个对象,因为有初始值,所以cur的值是数组的第一项[yes]
let nameNum = names.reduce((pre, cur) => {
// 第一次pre是一个对象,返回将这个对象返回,下一次pre又是一个对象了
if (cur in pre) {
pre[cur]++
} else {
pre[cur] = 1
}
return pre
}, {})
console.log(nameNum); //{yes: 2, hello: 1, hi: 1, yy: 1}
reduce实现数组去重[面试经常问]
let arr = [10, 20, 20, 41, 41, 1]
// 这次初始值是一个数组,,因为有初始值,所以cur的值是数组的第一项10
let newArr = arr.reduce((pre, cur) => {
// 如果没有,使用concat添加进去。这样就可以实现数组去重了
if (!pre.includes(cur)) {
return pre.concat(cur)
} else {
return pre
}
}, [])
console.log(newArr);
// [10, 20, 41, 1]
reduce实现数组扁平化
let arr = [
[1, 2],
[1, 2, 3],
[1, [1, 3, [1, 2, 3]]]
]
function flatten(arr) {
return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? flatten(cur) : cur), []);
}
console.log(flatten(arr)) //[1, 2, 1, 2, 3, 1, 1, 3, 1, 2, 3]
总结:reduce有无第二个参数的区别
1=>没有提供初始值,索引是从1开始的。提供了初始值索引是从0开始的。
2=>没有提供初始值循环次数等于数组长度-1。 提供了初始值循环次数等于数组的长度;
3=>没有提供初始值第一次cur是索引为1的那个值。提供了初始值cur是索引为0的那个值
4=>没有提供初始值空数组会报错。提供了初始值空数组不会报错。[] 10
js中数组reduce的使用原来这么简单的更多相关文章
- JS中数组的介绍
一.数组: 一组数据的集合: 二.JS中数组的特点: 1.数组定义时无需指定数据类型: 2.数组定义时可以无需指定数组长度: 3.数组可以存储任何类型的数据: 4.一般是相同的数据类型: 三.数组的创 ...
- js中数组方法大全
js数组方法大全 一:前言 我们在学到js中数组的时候,我们会接触到js中数组的一些方法,这些方法对我们来说,可以很遍历的达到我们想要的结果,但是因为方法比较多,有些方法也不常用,可能会过一段时间就会 ...
- js中数组的循环与遍历forEach,map
对于前端的循环遍历我们知道有 针对js数组的forEach().map().filter().reduce()方法 针对js对象的for/in语句(for/in也能遍历数组,但不推荐) 针对jq数组/ ...
- js中数组扁平化处理
- js中数组去重的几种方法
js中数组去重的几种方法 1.遍历数组,一一比较,比较到相同的就删除后面的 function unique(arr){ ...
- JavaScript -- 时光流逝(二):js中数组的方法
JavaScript -- 知识点回顾篇(二):js中数组的方法 1. 数组 (1)定义数组,数组赋值 <script type="text/javascript"> ...
- php和js中数组的总结
php中数组的表示方法:array()或者[] js中数组的表示方法:new array()或者[] 一.php中初始化命名数组 在PHP中声明数组的方式主要有两种:一是应用array()函数声明 ...
- js中数组增删查改unshift、push、pop、shift、slice、indexOf、concat、join
js中数组增删查改unshift.push.pop.shift.slice.indexOf.concat.join
- js中数组如何使用
js中数组如何使用 一.总结 一句话总结:new Array()和[]两种方法都可以创建数组. 二.js中创建数组,并往数组里添加元素 数组的创建 var arrayObj = new Array() ...
- js中数组去重方法及性能对比
js中数组的 数组去重 常用的数组去重方法以及效率分析: 首先我们先构建一个数组,主要是用于进行去重实验,我们主要实验的量级为1000,10000,100000,500000.具体的生成数组的方法如下 ...
随机推荐
- AI专家一席谈:复用算法、模型、案例,AI Gallery带你快速上手应用开发
摘要: 华为云社区邀请到了AI Gallery的负责人严博,听他谈一谈AI Gallery的设计初衷.经典案例以及未来规划. 本文分享自华为云社区<AI专家一席谈:复用算法.模型.案例,AI G ...
- SQL Server 附加数据库,报只读文件,无权修改其中某些文件
MSSQL 默认安装在 C盘下,由于C盘没空间了,迁到D盘,这时候在附件数据库是报了错误:附加数据库 因为它是只读的,它具有只读文件,无权修改其中某些文件 如果是可以附加,显示(只读)这时候不能删除 ...
- JMeter 源码解读 - HashTree
背景: 在 JMeter 中,HashTree 是一种用于组织和管理测试计划元素的数据结构.它是一个基于 LinkedHashMap 的特殊实现,提供了一种层次结构的方式来存储和表示测试计划的各个组件 ...
- python像操作文件一样操作内存的模块 StringIO
io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插 ...
- 详解 SSL(三):SSL 证书该如何选择?
在上一篇< 详解 SSL(二):SSL 证书对网站的好处>中,我们知道了在网站部署 SSL 证书后,不管是对网站本身还是对网站的用户都能够带来许多好处.那么随着 HTTPS 的普及,市面上 ...
- Python 3.12 抢先看——关于 f-string 的改动
Python 3.12 抢先看--关于 f-string 的改动 哈喽大家好,我是咸鱼 相信小伙伴们对 python 中的 f-string 都不陌生 f-string 是格式化字符串的缩写,是以小写 ...
- Codeforces Round #690 (Div. 3) (简单题解记录)
Codeforces Round #690 (Div. 3) 1462A. Favorite Sequence 简单看懂题即可,左边输出一个然后右边输出一个. void solve() { int n ...
- 文心一言 VS 讯飞星火 VS chatgpt (182)-- 算法导论13.4 6题
六.用go语言,Skelton 和 Baron 教授担心在 RB-DELETE-FIXUP 的情况1开始时,结点 x.p 可能不是黑色的.如果这两位教授是对的,则第5~6行就是错的.证明:x.p 在情 ...
- SpringBoot 集成短信和邮件
准备工作 1.集成邮件 以QQ邮箱为例 在发送邮件之前,要开启POP3和SMTP协议,需要获得邮件服务器的授权码,获取授权码: 1.设置>账户 在账户的下面有一个开启SMTP协议的开关并进行密码 ...
- yakit的web fuzzer功能的使用
问题 yakit没有Burp 的 Intruder 爆破模块,那么yakit该怎么进行参数爆破?yakit参数爆破的方式与burp有什么区别? 前言 手工测试场景中需要渗透人员对报文进行反复的发送畸形 ...