JavaScript 数组常用方法 find, findIndex, filter, map, flatMap, some

文章目录

JavaScript 数组常用方法详解:find, findIndex, filter, map, flatMap, some

这些数组方法都是ES6引入的,它们为处理数组提供了更简洁、更函数式的方式。下面我将详细介绍每个方法的用法和使用场景,并提供示例。

1. find()

作用:返回数组中满足提供的测试函数的第一个元素的值。如果没有找到则返回undefined。

使用场景:当你需要从数组中查找第一个符合条件的元素时。

javascript 复制代码
const users = [
  { id: 1, name: 'Alice', age: 25 },
  { id: 2, name: 'Bob', age: 30 },
  { id: 3, name: 'Charlie', age: 35 }
];

// 查找第一个年龄大于30的用户
const user = users.find(user => user.age > 30);
console.log(user); // { id: 3, name: 'Charlie', age: 35 }

// 查找不存在的用户
const notFound = users.find(user => user.age > 40);
console.log(notFound); // undefined
2. findIndex()

作用:返回数组中满足提供的测试函数的第一个元素的索引。若没有找到则返回-1。

使用场景:当你需要知道某个元素在数组中的位置时。

javascript 复制代码
const numbers = [10, 20, 30, 40, 50];

// 查找第一个大于25的元素的索引
const index = numbers.findIndex(num => num > 25);
console.log(index); // 2

// 查找不存在的元素的索引
const notFoundIndex = numbers.findIndex(num => num > 100);
console.log(notFoundIndex); // -1
3. filter()

作用:创建一个新数组,包含通过所提供函数实现的测试的所有元素。

使用场景:当你需要从数组中筛选出符合条件的多个元素时。

javascript 复制代码
const products = [
  { id: 1, name: 'Laptop', price: 999, inStock: true },
  { id: 2, name: 'Phone', price: 699, inStock: false },
  { id: 3, name: 'Tablet', price: 499, inStock: true }
];

// 筛选有库存的产品
const availableProducts = products.filter(product => product.inStock);
console.log(availableProducts);
// [
//   { id: 1, name: 'Laptop', price: 999, inStock: true },
//   { id: 3, name: 'Tablet', price: 499, inStock: true }
// ]

// 筛选价格低于500的产品
const cheapProducts = products.filter(product => product.price < 500);
console.log(cheapProducts);
// [{ id: 3, name: 'Tablet', price: 499, inStock: true }]
4. map()

作用:创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的返回值。

使用场景:当你需要对数组中的每个元素进行转换时。

javascript 复制代码
const numbers = [1, 2, 3, 4];

// 将每个数字平方
const squares = numbers.map(num => num * num);
console.log(squares); // [1, 4, 9, 16]

// 从对象数组中提取特定属性
const names = users.map(user => user.name);
console.log(names); // ['Alice', 'Bob', 'Charlie']

// 添加新属性
const usersWithStatus = users.map(user => ({
  ...user,
  status: user.age > 30 ? 'Senior' : 'Junior'
}));
console.log(usersWithStatus);
// [
//   { id: 1, name: 'Alice', age: 25, status: 'Junior' },
//   { id: 2, name: 'Bob', age: 30, status: 'Junior' },
//   { id: 3, name: 'Charlie', age: 35, status: 'Senior' }
// ]
5. flatMap()

作用:首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。相当于先map()再flat(1)。

使用场景:当你需要先映射然后扁平化结果时。

javascript 复制代码
const sentences = ["Hello world", "Good morning", "Have a nice day"];

// 将句子拆分为单词并扁平化
const words = sentences.flatMap(sentence => sentence.split(' '));
console.log(words);
// ['Hello', 'world', 'Good', 'morning', 'Have', 'a', 'nice', 'day']

// 传统方式需要先map再flat
const wordsOldWay = sentences.map(sentence => sentence.split(' ')).flat();
console.log(wordsOldWay); // 同上

// 处理嵌套数组
const data = [[1], [2, 3], [4]];
const flattened = data.flatMap(arr => arr.map(x => x * 2));
console.log(flattened); // [2, 4, 6, 8]
6. some()

作用:测试数组中是否至少有一个元素通过了提供的函数的测试。返回布尔值。

使用场景:当你需要检查数组中是否有元素满足某个条件时。

javascript 复制代码
const numbers = [1, 2, 3, 4, 5];

// 检查是否有偶数
const hasEven = numbers.some(num => num % 2 === 0);
console.log(hasEven); // true

// 检查是否有大于10的数
const hasLargeNumber = numbers.some(num => num > 10);
console.log(hasLargeNumber); // false

// 检查用户列表中是否有管理员
const users = [
  { id: 1, name: 'Alice', isAdmin: false },
  { id: 2, name: 'Bob', isAdmin: true },
  { id: 3, name: 'Charlie', isAdmin: false }
];
const hasAdmin = users.some(user => user.isAdmin);
console.log(hasAdmin); // true

一、查询类方法

1.includes()

检查数组是否包含某个值,返回布尔值

javascript 复制代码
[1, 2, 3].includes(2); // true
['a', 'b', 'c'].includes('d'); // false
2.indexOf() / lastIndexOf()

返回元素在数组中的第一个/最后一个索引,找不到返回-1

javascript 复制代码
['a', 'b', 'c', 'b'].indexOf('b'); // 1
['a', 'b', 'c', 'b'].lastIndexOf('b'); // 3
3.every()

检查是否所有元素都满足条件

javascript 复制代码
[12, 5, 8, 130, 44].every(x => x >= 10); // false
[12, 54, 18, 130, 44].every(x => x >= 10); // true

二、操作类方法

1.concat()

合并两个或多个数组

javascript 复制代码
[1, 2].concat([3, 4], [5, 6]); // [1, 2, 3, 4, 5, 6]
2.slice()

返回数组的浅拷贝部分

javascript 复制代码
['a', 'b', 'c', 'd'].slice(1, 3); // ['b', 'c']
3.splice()

修改数组内容(添加/删除元素)

javascript 复制代码
const arr = [1, 2, 3, 4];
arr.splice(1, 2, 'a', 'b'); // 返回 [2, 3]
console.log(arr); // [1, 'a', 'b', 4]

三、转换类方法

1.join()

将数组元素连接成字符串

javascript 复制代码
['Fire', 'Air', 'Water'].join(); // "Fire,Air,Water"
['Fire', 'Air', 'Water'].join('-'); // "Fire-Air-Water"
2. reduce() / reduceRight()

对数组元素执行累加器函数

javascript 复制代码
[1, 2, 3, 4].reduce((acc, val) => acc + val); // 10
[1, 2, 3, 4].reduce((acc, val) => acc + val, 5); // 15 (带初始值)

四、排序类方法

1.sort()

对数组元素进行排序(原地修改)

javascript 复制代码
const fruits = ['banana', 'apple', 'pear'];
fruits.sort(); // ['apple', 'banana', 'pear']

const numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b); // [1, 2, 3, 4, 5]
2. reverse()

反转数组顺序(原地修改)

javascript 复制代码
['a', 'b', 'c'].reverse(); // ['c', 'b', 'a']

五、迭代类方法

1. forEach()

对每个数组元素执行函数

javascript 复制代码
['a', 'b', 'c'].forEach((item, index) => {
  console.log(`${index}: ${item}`);
});
// 0: a
// 1: b
// 2: c

六、新增元素方法

1.push() / pop()

在数组末尾添加/删除元素

javascript 复制代码
const arr = [1, 2];
arr.push(3); // 返回新长度3,arr变为[1, 2, 3]
arr.pop(); // 返回3,arr变回[1, 2]
2.unshift() / shift()

在数组开头添加/删除元素

javascript 复制代码
const arr = [1, 2];
arr.unshift(0); // 返回新长度3,arr变为[0, 1, 2]
arr.shift(); // 返回0,arr变回[1, 2]

七、ES6+新增方法

1. flat()

将嵌套数组扁平化

javascript 复制代码
[1, 2, [3, 4]].flat(); // [1, 2, 3, 4]
[1, 2, [3, [4, 5]]].flat(2); // [1, 2, 3, 4, 5]
2. fill()

用固定值填充数组

javascript 复制代码
[1, 2, 3].fill(0); // [0, 0, 0]
[1, 2, 3, 4].fill(5, 1, 3); // [1, 5, 5, 4]
3. Array.from()

从类数组对象创建新数组

javascript 复制代码
Array.from('foo'); // ['f', 'o', 'o']
Array.from([1, 2, 3], x => x + x); // [2, 4, 6]

总结对比

方法 返回值 是否修改原数组 使用场景
concat() 新数组 合并数组
every() 布尔值 检查所有元素是否满足条件
fill() 修改后的数组 填充数组元素
filter() 新数组 筛选元素
find() 第一个匹配元素或undefined 查找单个元素
findIndex() 索引或-1 查找元素位置
flat() 新数组 扁平化嵌套数组
flatMap() 新数组 映射后扁平化
forEach() undefined 遍历数组
includes() 布尔值 检查是否包含值
indexOf() 索引或-1 查找元素首次出现位置
join() 字符串 连接数组为字符串
map() 新数组 转换每个元素
pop() 删除的元素 移除最后一个元素
push() 新长度 末尾添加元素
reduce() 累加结果 累加计算
reverse() 反转后的数组 反转数组顺序
shift() 删除的元素 移除第一个元素
slice() 新数组 截取数组部分
some() 布尔值 检查是否有元素满足条件
sort() 排序后的数组 数组排序
splice() 删除的元素数组 添加/删除元素
unshift() 新长度 开头添加元素

这些方法都遵循函数式编程的原则,不会修改原数组,而是返回新数组或值。它们可以链式调用,使得代码更加简洁和可读。

相关推荐
学网安的肆伍32 分钟前
【046-WEB攻防篇】注入工具&SQLMAP&Tamper编写&指纹修改&高权限操作&目录架构
前端·架构
森林的尽头是阳光1 小时前
tree回显问题
javascript·vue.js·elementui
weixin_BYSJ19871 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
Highcharts.js2 小时前
如何下载使用Highcharts Grid 开发web可编辑表格
前端·人工智能·grid 表格·web 表格·在线编辑表格·highcharts表格安装·表格开发工具
用户62960593247052 小时前
从“浏览器根本区分不了”到真正实现:刷新不退出,关闭标签页自动退出,前端判断浏览器关闭和刷新
前端
qetfw2 小时前
MWU:Vue 3 + FastAPI 的 MaaFramework 跨平台 WebUI 源码
前端·vue.js·python·fastapi·开源项目·效率工具
mfxcyh2 小时前
Vue3+Ant Design Vue 实现手动异步文件上传(含大小校验、弹窗上传)
前端·javascript·vue.js
wordbaby2 小时前
Web端热敏标签打印完整解决方案(QZ Tray + 译维A42)
前端
swipe2 小时前
03|Axios 请求进了后端之后:Controller、Request、Response 是怎么接住它的?
前端·后端·全栈
meilindehuzi_a2 小时前
Vue3进阶基础:指令修饰符、v-model表单绑定、动态样式、计算属性与侦听器实战
前端·javascript·vue.js