map、reduce、filter、every、some 用法与区别?

map 执行遍历一个数组,把原数组内的每一项进行一系列操作,return返回一个新数组,原数组不变,如果没有返回则得到一个所有值为undefined的数组([undefined,undefined,undefined]) map方法不需要定义变量来接收最后的数组结果,本身这个方法运行后的结果就是新数组,这个方法也可进行判断,找到其中的一项,然后进行操作,再进行返回,就得到改变后的数组了。

js 复制代码
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map((num) => num * 2);
// doubledNumbers 为 [2, 4, 6, 8, 10]

map的常用场景:

  1. 转换数组中的元素:map 方法最常见的用法是根据数组中的每个元素进行转换,生成一个新的数组。
  2. 提取对象数组中的特定属性:如果数组中的元素是对象,可以使用 map 方法提取对象的特定属性,生成一个包含这些属性值的新数组。例如,从一个包含学生对象的数组中提取学生姓名。
  3. 处理异步操作:map 方法也可以用于处理异步操作,例如对数组中的每个元素进行异步处理并返回一个包含处理结果的 Promise 数组。
js 复制代码
const urls = ["url1", "url2", "url3"];
const fetchResults = urls.map(async (url) => {
  const response = await fetch(url);
  return response.json();
});

Promise.all(fetchResults).then((results) => {
  // results 包含了所有请求的结果
});

reduce 这个方法被定义为数组的归并方法,这个方法和迭代方法(map,forEach,filter...)一样,都会对数组进行遍历,reduce与他们不同的是函数的第一个参数得到的是迭代计算后的效果,返回一个自定义的数据,对原数组不会产生操作 (多用于求和、求乘积、去重、数组转化为对象、映射过滤等等,真是个万金油方法)。

js 复制代码
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0);
// sum 为 15

reduce的常用场景:

  1. 计算。
  2. 去重。
  3. 数组转化为对象:将数组转化为对象,通常用于处理键值对数据。
  4. 映射和筛选:可以结合条件判断,对数组进行映射和筛选操作。

filter 筛选到符合条件的所有数据对象 返回一个新数组(符合条件的所有项) ,不会改变原数组,这个方法本身运行后的结果就是一个筛选后的新数组

js 复制代码
const numbers = [1, 2, 3, 4, 5];
// 将数组中大于等于 3 的元素过滤出来
const filtered = numbers.filter(function(num) {
  return num >= 3;
});
console.log(filtered); // 输出 [3, 4, 5]

filter的常用场景:

  1. 根据条件筛选列表数据,这是最常用的场景,根据自己的需要对原数组数据进行过滤
  2. 去除数组中的空值或无效值
  3. 去重,通过 filter 方法结合 indexOfincludes 方法,可以过滤掉数组中的重复元素。

find 筛选符合条件的第一个数据对象 返回的是符合条件的第一项的值 ,如果没有找到满足条件的元素,则返回 undefinedfind不会改变原数组,这个方法本身运行后的结果就是得到的那一个数据项

js 复制代码
const numbers = [1, 2, 3, 4, 5];
const foundNumber = numbers.find((element) => element > 3);
// foundNumber 为 4

find的应用场景:

  1. 查找对象属性,find 方法常用于从对象数组中查找具有特定属性值的对象,比如找到数组中id为2的数据。
  2. 处理数据不存在或不满足所需条件的情况,当 find 方法找不到满足条件的元素时,它会返回 undefined。可以利用这一点来处理找不到元素的情况。

every 返回这个数组全部都符合条件的bool值,全部匹配则返回真

js 复制代码
const numbers = [1, 2, 3, 4, 5];
const allEven = numbers.every((element) => element % 2 === 0);
// allEven 为 false

every 的应用场景:

  1. 检查所有元素是否满足条件,当数组中的每个元素都满足条件时,every 方法返回 true;否则返回 false
  2. 判断空数组:当前为空数组时方法会返回true,但一般不用every判断,判断空数组一般用array.length就可以了,严谨一点的话,可以结合Array.isArray()方法来确定变量是否为数组类型。

some 返回这个数组部分符合条件的bool值,只要有有一个存在,则返回为真,需要注意的是,some 方法在找到满足条件的元素后会立即停止遍历,不会继续执行剩余元素的检查。

js 复制代码
const array = [1, 2, 3, 4, 5];
const hasEvenNumber = array.some((element) => element % 2 === 0);
console.log(hasEvenNumber);  // 输出: true

some的应用场景:

  1. 检查数组中是否存在特定元素,可以使用 some 方法来检查数组中是否存在某个特定值或满足特定条件的元素。
  2. 权限控制:在权限控制逻辑中, 用some 方法检查用户是否具有特定权限。
  3. 表单验证:在表单验证过程中,检查是否有任何字段未通过验证。
相关推荐
万叶学编程2 小时前
Day02-JavaScript-Vue
前端·javascript·vue.js
前端李易安4 小时前
Web常见的攻击方式及防御方法
前端
PythonFun4 小时前
Python技巧:如何避免数据输入类型错误
前端·python
知否技术4 小时前
为什么nodejs成为后端开发者的新宠?
前端·后端·node.js
hakesashou4 小时前
python交互式命令时如何清除
java·前端·python
天涯学馆4 小时前
Next.js与NextAuth:身份验证实践
前端·javascript·next.js
HEX9CF5 小时前
【CTF Web】Pikachu xss之href输出 Writeup(GET请求+反射型XSS+javascript:伪协议绕过)
开发语言·前端·javascript·安全·网络安全·ecmascript·xss
ConardLi5 小时前
Chrome:新的滚动捕捉事件助你实现更丝滑的动画效果!
前端·javascript·浏览器
ConardLi5 小时前
安全赋值运算符,新的 JavaScript 提案让你告别 trycatch !
前端·javascript