【基础恶补】JavaScript数组的一些方法,reduce,filter,reverse,map等
创始人
2024-03-18 10:15:16
0次

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 对象,该对象包含数组每个索引的值。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...