ES6形式常用的数组遍历函数

本文详细介绍了JavaScript中find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()等函数的用法,包括查找对象、数组过滤、迭代与变换,以及规约操作。适合深入理解数组处理的开发者。


0. 给定一个数组
const arr = [{
	name: '袁绍',
		age: 33,
		title: '本初',
		index: 2
	},
	{
		name: '曹操',
		age: 40,
		title: '孟德',
		index: 1
	},
	{
		name: '刘备',
		age: 35,
		title: '玄德',
		index: 6
	},
	{
		name: '马超',
		age: 30,
		title: '孟起',
		index: 7
	},
	{
		name: '张飞',
		age: 28,
		title: '翼德',
		index: 3
	},
	{
		name: '关羽',
		age: 27,
		title: '云长',
		index: 4
	},
	{
		name: '赵云',
		age: 22,
		title: '子龙',
		index: 4
	},
]
1. find():查找成员对象

用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。find()返回的结果是一个对象

const obj1 = arr.find(item => item.age < 30)
const obj2 = arr.find(item => item.index == 4)
const obj3 = arr.find(item => item.title !== '玄德')
const obj4 = arr.find(item => item.name.indexOf('关', 0) !== -1)

console.log(obj1) //{"name": "张飞","age": 28,"title": "翼德","index": 3}
console.log(obj2) //{"name": "关羽","age": 27,"title": "云长","index": 4}
console.log(obj3) //{"name": "袁绍","age": 33,"title": "本初","index": 2}
console.log(obj4) //{"name": "关羽","age": 27,"title": "云长","index": 4}

字符串查找可参考这里

2. findIndex():查找成员下标

返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。findIndex()返回的结果是一个整型的值

const index1 = arr.findIndex(item => item.age < 30)
const index2 = arr.findIndex(item => item.index == 4)
const index3 = arr.findIndex(item => item.title !== '玄德')
const index4 = arr.findIndex(item => item.name.indexOf('关', 0) !== -1)

console.log(index1) //4
console.log(index2) //5
console.log(index3) //0
console.log(index4) //5
3. filter():过滤数组

使用指定的回调函数测试所有数组元素,并创建一个包含所有通过测试的元素构成的新数组。filter()不改变原数组内容,返回的结果是一个新的数组

const arr1 = arr.filter(item => item.age < 30)
const arr2 = arr.filter(item => item.index == 4)
const arr3 = arr.filter(item => item.title !== '玄德')
const arr4 = arr.filter(item => item.name.indexOf('关', 0) !== -1)

console.log(arr1)
console.log(arr2)
console.log(arr3)
console.log(arr4)

返回值
在这里插入图片描述

注意:上边所述的函数都是有返回值的。因此,箭头函数体部分都是一个可以得到布尔值的表达式,而不是一个语句块{…}。当然也可以显式return一个具有布尔值的表达式。

4. forEach():迭代数组

遍历数组所有元素,利用回调函数对数组的每一个元素进行操作。不支持break或continue关键字。特别地,return只用于决定是否结束当前循环(不是整个循环),类似continue。forEach()仅是一个遍历操作,没有返回值——可理解为返回void。forEach()不会修改原来的数组。

let newArr = []
arr.forEach(item => {
	if (item.age < 30) {
		newArr.push(item.name)
	}
})

newArr.forEach(item => {
	console.log(item)
})
/* 输出:
张飞
关羽
赵云
*/

既然是操作,箭头函数体部分当然要使用{…}语句块形式。

let nb
arr.forEach(item => {
	if (item.index === 4) { // 4可有两个呕!
		nb = item.name
	}
})

console.log(nb) // 赵云

//return到底有啥用?
let nb
arr.forEach(item => {
	if (item.index === 4) {
		nb = item.name
		return
	}
})

console.log(nb) // 还是输出:赵云

//再看
let nb
arr.forEach(item => {
	if (item.index === 4) {
		nb = item.name
		return // 相当于continue
		console.log(nb) //不被输出
	}
})

特殊方法修改原数组内容

let test = arr.forEach((item, index, input) => {
	input[index] = item.age + 10
})
console.log(test) // 没有返回值
console.log(arr) // 原数组被改了

结果
在这里插入图片描述

5. some()和every():量词遍历

两个函数都遍历数组中的所有元素。两个函数都返回布尔值

  • some()
    存在量词,数组中只要存在(至少一个)满足条件的元素就返回true,否则返回false。
  • every()
    全称量词,数组中的元素必须都满足条件才返回true,否则返回false。
console.log(
	arr.some(item => item.age > 39)
) // true

console.log(
	arr.every(item => item.age < 30)
) // false
6. map():变换

依次处理数组中的每一个元素。每一个元素均被map()定义的回调函数进行变换,将变换后的元素再收集起来,最终返回一个新的数组
map()不会对空数组进行处理,不会改变原始数组。

const newArr = arr.map(item => item.name)
console.log(newArr) //["袁绍","曹操","刘备","马超","张飞","关羽","赵云"]

const newArr = arr.map(item => item.age > 30)
console.log(newArr) //[true,true,true,false,false,false,false]

const newArr = arr.map(item => item.age > 30? 'A':'B')
console.log(newArr) //["A","A","A","B","B","B","B"]

const newArr = arr.map(item => {
	if (item.index < 4) {
		return item
	}
})

console.log(newArr)
/** 输出:
[
    {
        "name": "袁绍",
        "age": 33,
        "title": "本初",
        "index": 2
    },
    {
        "name": "曹操",
        "age": 40,
        "title": "孟德",
        "index": 1
    },
    null,
    null,
    {
        "name": "张飞",
        "age": 28,
        "title": "翼德",
        "index": 3
    },
    null,
    null
]
*/

const newArr = arr.map(item => item.age + 10)
console.log(newArr) // [43,50,45,40,38,37,32]

数组成员是对象的变换

const newArr = arr.map(item => {
	let {name, age, title} = item
	let elem = {
		name,
		age: age+10,
		alias: title
	}
	return elem
})

console.log(newArr)

结果
在这里插入图片描述

7. reduce():规约

这里“规约”类似于SQL中的聚合函数。即把一个数组表达的集合聚合为一个值——多个值变一个值。该函数最终返回一个单值

// preVal:前一次调用reduce()的返回值;currVal:当前遍历到的数组元素
const totle = arr.reduce((preVal, currVal) => {
	return preVal + currVal.age
}, 0) // 0是初始值

console.log(totle) //215
<think>好的,我需要回答用户关于ES6数组遍历方法的问题,并给出示例。首先,我需要回忆ES6常用数组遍历方法,确保涵盖主要的方法如forEach、map、filter、reduce、some、every、find、findIndex等。同时,要注意用户提供的引用内容,可能需要结合这些引用中的信息来完善回答。 根据引用[1]、[3]、[4],forEach和map的区别是重点,forEach不返回新数组,而map会返回处理后的新数组。此外,其他方法如filter、reduce、some、every等也需要解释清楚,每个方法的作用和示例代码。 接下来需要组织回答结构,确保每个方法都有示例代码和说明,并且符合用户要求的格式:行内数学表达式用$...$,独立公式用$$...$$。不过在这个问题中可能数学公式较少,但如果有的话需要注意格式。比如如果提到数组长度,可能需要用$n$表示。 然后检查每个引用是否被正确引用,比如引用[3]提到map不改变原数组,而返回新数组,这在示例中需要体现。引用[4]对各个方法进行了小结,可以适当引用到每个方法的解释中。 还要生成相关问题,可能需要考虑用户可能进一步询问的问题,如性能比较、实际应用场景、如何选择方法等。 最后确保回答使用中文,代码块格式正确,引用标识自然添加在段落末尾。例如,当提到map方法时,引用[3]和[4]的相关内容需要标注。 现在需要逐个整理每个方法,给出示例代码,并附上对应的引用。确保每个方法的说明准确,示例简洁明了。同时,代码示例中的语法要正确,比如使用箭头函数、正确的参数传递等。 可能需要注意用户提供的引用中有提到ES6遍历方法,如findIndex、includes等,也需要包含在回答中。另外,引用[5]似乎关于CSS定位,可能与当前问题无关,可以忽略。 最后,生成的相关问题需要与ES6数组遍历方法相关,比如询问应用场景、区别、性能优化等。确保问题有针对性,能够帮助用户进一步学习。</think>### ES6数组遍历方法及示例 ES6提供了多种数组遍历方法,每种方法适用于不同场景。以下是常用方法及示例: --- #### 1. **`forEach`方法** - **功能**:遍历数组元素,执行回调函数,**不返回新数组**。 - **示例**: ```javascript const arr = [1, 2, 3]; arr.forEach((element, index) => { console.log(`索引${index}的值是${element}`); }); // 输出: 索引0的值是1、索引1的值是2、索引2的值是3 ``` - **特点**:适合仅需遍历的场景,如打印或修改原数组[^1][^4]。 --- #### 2. **`map`方法** - **功能**:遍历数组并返回**新数组**,元素为回调函数返回值。 - **示例**: ```javascript const arr = [1, 2, 3]; const doubled = arr.map(x => x * 2); console.log(doubled); // 输出: [2, 4, 6] ``` - **特点**:不修改原数组,适合数据转换[^3]。 --- #### 3. **`filter`方法** - **功能**:返回符合条件的新数组。 - **示例**: ```javascript const arr = [1, 2, 3, 4]; const even = arr.filter(x => x % 2 === 0); console.log(even); // 输出: [2, 4] ``` - **特点**:用于筛选元素,如过滤无效数据。 --- #### 4. **`reduce`方法** - **功能**:遍历数组并**累积计算结果**。 - **示例**(求和): ```javascript const arr = [1, 2, 3]; const sum = arr.reduce((acc, cur) => acc + cur, 0); console.log(sum); // 输出: 6 ``` - **特点**:适合统计或聚合操作。 --- #### 5. **`some`与`every`方法** - **`some`**:判断**至少一个元素**满足条件。 ```javascript const arr = [1, 2, 3]; const hasEven = arr.some(x => x % 2 === 0); console.log(hasEven); // 输出: true ``` - **`every`**:判断**所有元素**满足条件。 ```javascript const allEven = arr.every(x => x % 2 === 0); console.log(allEven); // 输出: false ``` - **特点**:用于快速验证数组元素。 --- #### 6. **`find`与`findIndex`方法** - **`find`**:返回**第一个满足条件**的元素。 ```javascript const users = [{id:1}, {id:2}]; const user = users.find(u => u.id === 2); console.log(user); // 输出: {id: 2} ``` - **`findIndex`**:返回满足条件的元素**索引**。 ```javascript const index = users.findIndex(u => u.id === 2); console.log(index); // 输出: 1 ``` - **特点**:替代`for`循环查找场景。 --- #### 7. **`includes`方法** - **功能**:判断数组**是否包含某值**。 - **示例**: ```javascript const arr = [1, 2, 3]; console.log(arr.includes(2)); // 输出: true ``` - **特点**:简单值查找,不支持对象比较[^4]。 --- ### 方法对比表 | 方法 | 返回值 | 是否修改原数组 | 典型场景 | |------------|--------------|----------------|------------------------| | `forEach` | `undefined` | 否 | 遍历操作 | | `map` | 新数组 | 否 | 数据转换 | | `filter` | 筛选后数组 | 否 | 条件过滤 | | `reduce` | 累积值 | 否 | 统计或聚合 | | `some` | `boolean` | 否 | 存在性检查 | | `find` | 元素或`undefined` | 否 | 查找单个元素 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值