reduce

reduce方法会对数组中的每个元素按序执行由你提供的reducer函数,每一次运行reducer会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

用法,两个参数callbackFn 和 initialValue

reduce(callbackFn, initialValue)
// 箭头函数reduce((pre,cur,curIndex,array) =>{...
}, initialValue)

callbackFn即上文提到的reducer函数,里面包含四个参数:

  • previousValue:上一次调用 callbackFn 时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0]。
    -currentValue:数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,其值则为数组索引为 0 的元素 array[0],否则为 array[1]。
  • currentIndex:数组中正在处理的元素的索引。若指定了初始值
  • initialValue,则起始索引号为 0,否则从索引 1 起始。
  • array:用于遍历的数组。

initialValue: 这个参数是一个可选参数,作为第一次调用reducer时的previousValue.
若指定了初始值 initialValue,则 currentValue 则将使用数组第一个元素;否则 previousValue 将使用数组第一个元素,而 currentValue 将使用数组第二个元素。

返回值:使用“reducer”回调函数遍历整个数组后的结果

示例

1、累加求和

let total = [ 0, 1, 2, 3 ].reduce(( previousValue, currentValue ) => previousValue + currentValue,0
)

2、累加对象中的值

const arr = [{ x: 1 }, { x: 3 }, { x: 5 }];
const countValue = arr.reduce((pre, cur) => {return pre + cur?.x;}, 0);

3、将二维数组转换为一维数组

 const arr = [[0, 1], [2, 3], [4, 5]];const flattened = arr.reduce((pre, cur) => {return pre.concat(cur}, []);

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

  let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice','Bob']let countNames = names.reduce((pre,cur) => {if(cur in pre){pre[cur]++}else{pre[cur] = 1}return pre;}, {} as any)

5、按属性对object分类

  let people = [{ name: 'Alice', age: 21 },{ name: 'Max', age: 20 },{ name: 'Jane', age: 20 }];let groupBy = people.reduce((pre,cur) => {if(cur?.age in pre){pre[cur?.age].push(cur)}else{pre[cur?.age] = [cur]}return pre;}, {} as any)

6、使用扩展运算符和 initialValue 绑定包含在对象数组中的数组

 let 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}];const books = friends.reduce((pre, cur) => {return [...pre,...cur.books]}, ['Abookss']);

7、使用 .reduce() 替换 .filter().map()
reduce 只会遍历一次,
而filter和map会遍历两次,reduce更加高效

filter

filter方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。

返回值:一个新的、通过测试的元素组成的数组,如果没有符合条件的,则返回一个空数组。

参数 两个参数:callbackFn、thisArg

filter(callbackFn,thisArg)

callbackFn:

  • element
    数组中当前正在处理的元素。
  • index
    正在处理的元素在数组中的索引。
  • array
    调用了 filter() 的数组本身。

thisArg: 执行callback时,用于this的值。

示例
1、过滤json中的无效条目

        const arr = [{ id: 15 },{ id: -1 },{ id: 0 },{ id: 3 },{ id: 12.2 },{},{ id: null },{ id: NaN },{ id: 'undefined' },];const newArr = arr.filter((item) => {if (item?.id !== 0 && Number.isFinite(item?.id)) return true;return false;});

Number.isFinite() 用来检测传入的参数是否是一个有穷数。返回布尔值。
那么…… 什么是有穷值?
我没有找到合适的解释,不过可以看看下面的例子,有知道的阔以告诉我~~

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // falseNumber.isFinite(0);         // true
Number.isFinite(2e64);      // trueNumber.isFinite('0');       // false, would've been true with// global isFinite('0');Number.isFinite(null);      // false, would've been true with// global isFinite(null)

forEach

map

map 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。

["1", "2", "3"].map(parseInt);

期望输出 [1, 2, 3], 而实际结果是 [1, NaN, NaN].
因为parseInt 在这里接受了两个参数,一个是遍历的元素item,一个是下标值
修改后:

["1", "2", "3"].map(parseInt(item,10));

其他方法:
.at() 接收一个整数值并返回该索引对应的元素,允许正数和负数。负整数从数组中的最后一个元素开始。
contact 用于合并两个或者多个数组。不会改变原有数组,而是返回一个新数组。
entries 返回一个新的数组迭代器对象,该对象包含数组中每个索引的键、值对。
every 测试一个数组内所有的元素是否都能通过某个指定函数的测试。返回一个布尔值。
判断数组里的元素是否都大于10

        const arr = [12, 5, 8, 130, 44];const isTen = arr.every((item: number) => item > 10);

fill: 用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。
语法:

fill(value)
fill(value, start)
fill(value, start, end)

find 返回数组中满足提供的测试函数的第一个元素的值。否则返回undefined

find((element, index, array) => { /* … */ } )

findIndex() 和find类似,返回的是索引
findLast() 和find类似,返回的是满足条件的最后一个元素
findLastIndex() 和findLast()类似,返回的是索引
flat 会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并成一个新数组返回。

flat()
flat(depth)

Array.from()
对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
includes 判断一个数组是否包含一个指定的值,如果包含返回true,否则false.
indexOf 返回找到给定元素的第一个索引,不存在则返回-1
isArray 确定传递的值是否是一个Array, 返回布尔值
join 将一个数组的所有元素连接成一个字符串并返回。

[12, 5, 8, 130, 44].join(); //12,5,8,130,44
[12, 5, 8, 130, 44].join(""); //125813044
[12, 5, 8, 130, 44].join("-"); //12-5-8-130-44

lastIndexOf 返回指定元素在数组中的最后一个索引,没有返回-1
of() 通过可变数量的参数创建一个新的array示例。
pop() 从数组删除最后一个元素,并返回这个元素,会更改原数 组
push() 将一个或多个元素添加到数组的末尾,并返回该数组的新长度。会改变原数组。
reverse() 将数组中元素的位置颠倒,并返回该数组。会改变原数组。
shift() 从数组周狗删除第一个元素,并返回该值。改变原数组
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

slice(start, end)

其他用法:
方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组。

 Array.prototype.slice.call(arguments);或者[].slice.call(arguments)

some() 测试数组中是不是至少有一个元素通过了被提供的函数测试。

[12, 5, 8, 130, 44].some(ele => ele > 40) //true

sort() 对数组的元素进行排序,并返回数组。
默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的
语法之一:

// 箭头函数
sort((a, b) => { /* … */ } )

compareFn(a, b) 返回值 排序顺序
0 a 在 b 后
< 0 a 在 b 前
=== 0 保持 a 和 b 的顺序

splice(): 通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

splice(start)
splice(start, deleteCount)
splice(start, deleteCount, item1)
splice(start, deleteCount, item1, item2, itemN)

toLocalString(): 返回一个字符串表示数组中的元素。数组中的元素将使用各自的 toLocaleString 方法转成字符串,这些字符串将使用一个特定语言环境的字符串(例如一个逗号 “,”)隔开。
toString(): toString() 方法返回一个字符串,表示指定的数组及其元素。
unshift() 将一个或多个元素添加到数组开头,会返回长度,会改变原数组。
values() 方法返回一个新的 Array Iterator 对象,该对象包含数组每个索引的值。

【基础恶补】JavaScript数组的一些方法,reduce,filter,reverse,map等相关推荐

  1. Java宣言的时候,Java基础恶补——宣言及访问控制

    Java基础恶补--声明及访问控制 [SCJP Sun Certified Programmer for Java 6 Study Guide (Exam 310-065)]  chapter 1 一 ...

  2. Java基础恶补——内存泄露、内存溢出

     Java基础恶补--内存泄露.内存溢出 (2010-09-15 15:56:26) 转载 标签: 杂谈 要点 内存泄露是指程序中间动态分配了内存,但在程序结束时没有释放这部分内存,从而造成那部分 ...

  3. Javascript数组的 splice方法介绍

    Javascript数组的 splice 方法介绍 splice() 方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容.此方法会改变原数组. 语法格式 array ...

  4. Javascript 数组求和的方法

    1.应用场景 主要用于数组求和. 2.学习/操作 JavaScript 数组求和的方法 var array = [1, 2, 3, 4, 5]; var sum = 0; 1.for循环 for (l ...

  5. js reduce实现中间件_js数组高阶方法reduce经典用法代码分享

    以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...

  6. JavaScript数组常用的方法总结

    导读:在实际开发中,前端工程师除了写页面布局及样式还要对后端返回的数据进行处理,返回的数据大多数是json格式,一般都是返回一个对象或者数组,下面对常用的数组的使用方法进行总结,方便在开发中手到擒来! ...

  7. JavaScript数组内置方法-知识

    /*         *  数组中常用的内置方法:基于这些方法可以让我们有效的对数组进行操作         *  console.dir(Array.prototype)  查看数组内置方法     ...

  8. Javascript数组常见的方法

    分为两种:原型(实例)方法和静态函数 第一类:原型方法: 栈方法(后进先出) push 参数:任意个 作用:将任意数量的参数逐个添加到数组尾部 返回值: 新数组的长度 影响:破坏了原数组 pop 参数 ...

  9. JavaScript数组属性和方法

    数组 字面量声明数组 let arr = [1,2,3,4] 构造函数声明数组 let arr = new Array(1,2,3) arr[0] = "a" arr[1] = & ...

最新文章

  1. 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)
  2. 限制input输入小数只能到3位或者只能输入正整数(兼容ios)
  3. HelloFresh迁移至新的API网关,实现微服务架构
  4. 【Linux网络编程】组播
  5. Java使用线程并发库模拟弹夹装弹以及发射子弹的过程
  6. mysql如何修改开启允许远程连接
  7. 公主病 - 百度百科
  8. RTX5 | 消息队列02 - 放入与取出消息
  9. CV+医疗领域实践项目!适合入门的图像分类领域新赛事
  10. iptables端口转发
  11. 10.Swoole 运行流程
  12. Android自定义View里面获取宽高及dp和px间的转换
  13. 苹果电脑表格取消自动计算机,苹果电脑excel序列被隐藏怎么办
  14. iapp模块的使用教程,iapp怎么调用api
  15. bulldog-vulnhub
  16. html语言怎么在虚线中加字,html – 用CSS添加虚线spacer / infill
  17. 当 AI 应用在心理健康领域是怎样的体验? #Woebot Health
  18. 014 Rust死灵书之显式类型转换
  19. Linux和Win10双系统出现GUN GRUB解决方法
  20. 基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 方案和思路

热门文章

  1. PyTorch 使用torchvision进行图片数据增广
  2. Linux下用C实现域名到IP的转换(域名解析)
  3. 阿里云服务器优势和特点
  4. linux内核内存检测方法实践手记
  5. c# 火狐浏览器怎么嵌入窗体中_C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子...
  6. 学校人力资源管理系统——逻辑结构设计
  7. POX学习笔记之POX拓扑发现原理分析
  8. bzoj 5041: LWD的降临
  9. 无人车智能挑战赛自主巡航篇
  10. 监控卡驱动程序和软件的安装