来自数组原型 Array.prototype 的遍历函数
1. Array.prototype.forEach()
forEach() 是一个专为遍历数组而生的方法,它没有返回值,也不会改变原数组,只是简单粗暴的将数组遍历一次
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
如果传入了参数 thisArg,在 callback() 内部的 this 都会指向 thisArg(箭头函数除外)
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [, , ];
arr.forEach((item, index, array) => {
console.log(index, item, array);
});
但 forEach() 无法中止遍历(除非出现错误),所以如果希望在遍历过程中跳出循环,不建议使用 forEach()
2. Array.prototype.map()
map() 在遍历数组的时候,会接收 callback() 的返回值作为新数组的元素,最后返回这个新数组
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [, , ];
arr.map((item, index, array) => {
return item + index;
});
// [1, 3, 5]
同样的,map() 不会修改原数组,也不能提前中止循环
由于 map() 会基于 callback() 的返回值创建新数组,所以有一些特别的用法,比如将字符串数组转为 Number 类型:
let arr = ['', '', ''];
arr = arr.map(Number);
// [1, 2, 3]
3. Array.prototype.filter()
filter() 可以基于测试函数 callback() 的返回值,筛选出原数组中符合条件的元素,组成新数组并返回
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
和 map() 不同的是,map() 中 callback() 的返回值会直接作为新数组的元素
而 filter() 会基于 callback() 的结果,判断是否将原数组的对应元素过滤掉
如果 callback() 的返回值为 true 或者等价于 true 的值(truthy),则保留该元素,否则排除该元素,最后返回新数组
const arr = [, , , , , ];
arr.filter((item, index, array) => {
return item > 10;
});
// [20, 12, 18]
filter() 不会修改原数组,也不能提前结束遍历
4. Array.prototype.every()
every() 是一个检测数组的方法,可以传入一个检测函数作为 callback()
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
如果这个检测函数每次都返回 true(truthy),则 every() 会返回 true
every() 会按照数组的顺序,为每个数组元素执行一次 callback() 方法,如果有一个返回值为 false,则停止遍历,并返回 false
const arr = [, '', 'name', ];
arr.every((item, index, array) => {
console.log(item);
return typeof item === 'number';
});
// 1 -> '2' -> false
5. Array.prototype.some()
some() 和 every() 类似,他们的区别仅仅是“且”和“或”的区别
every() 需要所有元素都满足条件才会返回 true,而 some() 只要有一个元素满足条件,就立刻返回 true
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [, '', 'name', ];
arr.some((item, index, array) => {
console.log(item);
return typeof item === 'number';
});
// 1 -> true
6. Array.prototype.find()
find() 可以接收一个 callback() 作为检测函数,返回数组中第一个满足条件的元素并中止遍历,否则返回 undefined
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [
{ id: , name: 'lee' },
{ id: , name: 'rock' },
{ id: , name: 'poly' }
];
arr.find((item, index, array) => {
return item.id > ;
});
// {id: 2, name: "rock"}
7. Array.prototype.findIndex()
findIndex() 是 find() 的孪生兄弟,find() 会返回元素的值,而 findIndex() 会返回元素的索引
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| thisArg | 可选 | 执行回掉时用作 this 的对象 |
callback 参数:
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [
{ id: , name: 'lee' },
{ id: , name: 'rock' },
{ id: , name: 'poly' }
];
arr.find((item, index, array) => {
return item.id > ;
});
//
如果没有满足条件的元素,则返回 -1
8. Array.prototype.indexOf()
indexOf() 用于查找某个元素在数组中的第一个索引,若无则返回 -1
参数:
| item | 必填 | 目标元素 |
| startIndex | 可选 | 开始查找的位置,默认为 0,如果是负值,则从末尾开始查找 |
这里的 startIndex 即使传入负值,数组遍历的顺序也不会改变,依然是从前往后遍历
const arr = [, , ];
arr.indexOf();
//
如果目标值是一个 Object,这里就会有一些出乎意料的结果
const arr = [
{ id: , name: 'lee' },
{ id: , name: 'rock' },
{ id: , name: 'poly' }
];
arr.indexOf({ id: , name: 'lee' });
// -1
这里的目标元素 {id: 1, name: 'lee'} 明明存在于 arr 中,但 indexOf() 返回的索引却是 -1
这是因为 JS 的 Object 都存放在堆内存里面,上面的代码其实在堆内存中创建了两个对象 {id: 1, name: 'lee'}
虽然这两个对象看起来一模一样,但本身依旧是两个对象,所以 indexOf() 的返回值为 -1
const obj1 = {id: , name: 'lee'},
obj2 = {id: , name: 'rock'},
obj3 = {id: , name: 'poly'};
const arr = [obj1, obj2, obj3];
arr.indexOf(obj1); //
如果像上面这样,将对象保存在一个变量中,这个变量实际保存的是这个对象的指针
arr 基于指针添加元素,indexOf() 查找的也是指针,这样就能返回正确的索引
但实际业务中很少会有基于对象指针创建数组的情况,所以一般不用 indexOf 来检测对象数组
9. Array.prototype.includes()
includes() 和 indexOf() 类似,区别在于 indexOf() 会返回索引,而 includes() 只返回 ture 或 false
参数:
| item | 必填 | 目标元素 |
| startIndex | 可选 | 开始查找的位置,默认为 0,如果是负值,则从末尾开始查找 |
const arr = ['a', 'b', 'c'];
arr.includes('a'); // true
arr.includes('a', -); // false
由于上面提到过的原因,对象数组不能使用 includes 方法来检测
10. Array.prototype.reduce()
reduce() 会对数组的每一个元素执行 callback() 函数
在遍历过程中,每次 callback() 的返回值,都会在下次调用 callback() 的时候,作为参数 accumulator 传进去,最终汇总为单个返回值
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| initialValue | 可选 | 作为第一次调用 callback() 时的第一个参数。如果没有提供初始值,则使用数组中的第一个元素。 |
callback 参数:
| accumulator | 累计值 |
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [, , , , , ];
arr.reduce((acc, item, index, array) => {
return acc + item;
});
// 1 + 2 + 3 + 4 + 5 + 6 = 21
基于累加的特性,可以实现数组去重
const arr = [, , , , , , , ];
arr.reduce((acc, item) => {
if (!acc.includes(item)) {
return acc.concat(item)
} else {
return acc
}
}, []);
// [1, 2, 4, 5, 3]
以及数组的扁平化 flat
const arr = [,,,[,,,, [,,]]];
function flattenDeep(arr) {
return arr.reduce((acc, val) => Array.isArray(val)
? acc.concat(flattenDeep(val))
: acc.concat(val),
[]
);
}
flattenDeep(arr);
// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
// 等价于 -> arr.flat(Infinity)
需要注意的是,如果没有提供初始值 initialValue,reduce 会从第二个元素开始执行 callback(),跳过第一个元素
如果提供初始值,则从第一个元素开始。如果数组为空且没有提供初始值,则报错
如果数组仅有一个元素,且没有初始值, 或者有初始值但是数组为空,那么此唯一值将被返回,并且不会执行 callback
11. reduceRight()
reduce() 是从左到右升序遍历,而 reduceRIght() 的顺序会反过来,从右到左降序遍历
参数:
| callback() | 必填 | 在数组每一项上执行的函数 |
| initialValue | 可选 | 作为第一次调用 callback() 时的第一个参数。如果没有提供初始值,则使用数组中的第一个元素。 |
callback 参数:
| accumulator | 累计值 |
| item | 当前遍历到的数组元素 |
| index | 当前元素的索引 |
| array | 被遍历的数组本身 |
const arr = [, , , , ];
arr.reduceRight((acc, item) => {
console.log('item', item);
return acc + item;
});
// 3 -> 2 -> 1 -> 0 -> 10
来自数组原型 Array.prototype 的遍历函数的更多相关文章
- 数组方法 Array.prototype
Object.prototype 数组的值是有序的集合,每一个值叫做元素,每一个元素在数组中都有数字位置编号,也就是索引,js中数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或者 ...
- Array.prototype
Array.prototype 属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- 构造函数、原型对象prototype、实例、隐式原型__proto__的理解
(欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指出来~) PS: 内容中的__proto__可能会被markdown语法导致显示为proto. 建议将构造函数中的方法都定义到构造函数的原 ...
- 【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解
我们知道函数里面的参数实际上是一个以数组形式储存的对象 但它并非一个数组 如果我们要将它转换为数组可以调用Array.prototype.slice() 这个方法 分析一下这个方法: Array.pr ...
- Array.prototype.forEach数组遍历
forEach是Array新方法中最基本的一个,就是遍历,循环.先看以前是怎么遍历数组的 常用遍历 var arr = [1,2,3,4,5]; for(var i = 0; i < arr.l ...
- JavaScript利用数组原型,添加方法实现遍历多维数组每一个元素
原型就是提供给我们为了让我们扩展更多功能的. 今天学习了用js模拟底层代码,实现数组多维的遍历.思想是在数组原型上添加一个方法. // js中的数组forEach方法,传入回掉函数 能够帮助我们遍历数 ...
- java基础64 JavaScript中的Arrays数组对象和prototype原型属性(网页知识)
1.Arrays数组对象的创建方式 方式一: var 变量名=new Array(); //创建一个长度为0的数组. 方式二: var 变量名=new Array(长度); //创建一个指定长度的数组 ...
- 数组的方法之(Array.prototype.forEach() 方法)
forEach() 方法对数组的每个元素执行一次提供的函数. 注意: 没有返回一个新数组 并且 没有返回值! 应用场景:为一些相同的元素,绑定事件处理器! const arr = ['a', 'b', ...
随机推荐
- tar命令-解压和压缩文件
tar命令 可以用来压缩打包单文件.多个文件.单个目录.多个目录. Linux打包命令_tar tar命令可以用来压缩打包单文件.多个文件.单个目录.多个目录. 常用格式: 单个文件压缩打包 tar ...
- LeetCode 139. Word Break单词拆分 (C++)
题目: Given a non-empty string s and a dictionary wordDict containing a list of non-emptywords, determ ...
- TensorFlow.js入门:一维向量的学习
转载自:https://blog.csdn.net/weixin_34061042/article/details/89700664 一维向量及其运算 tensor 是 TensorFlow.js 的 ...
- Linux查看进程和已知端口是否启动
如查看activeMQ的61616这个端口是否启动,以及直接查看activeMQ进程是否启动,可以通过如下命令进行查看 其中netstat命令必须知道端口,如果能查出就证明已启动,如果查出没有结果则表 ...
- Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据
相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...
- springcloud(七,多个服务消费者配置,以及zuul网关案例)
spring cloud (一.服务注册demo_eureka) spring cloud (二.服务注册安全demo_eureka) spring cloud (三.服务提供者demo_provid ...
- 推荐支付宝 Android 专项测试工具SoloPi
推荐支付宝 Android 专项测试工具SoloPi 1 介绍 SoloPi是一个无线化.非侵入式的Android自动化工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝 ...
- JAVA8之StringJoiner
作用:运用了StringBuilder的一个拼接字符串的封装处理 示例: StringJoiner sj = new StringJoiner("-", "[" ...
- 国家虚拟仿真实验教学项目共享平台(实验空间)PHP SDK
使用XJWT标准,此标准基于JSON Web Token (JWT)开发.XJWT包含三个参数:header, payload, signature,因此生成token就要先获得这三个参数. clas ...
- (十五)golang--init函数
每一个源文件都会包含一个init函数,这个函数会在执行main()执行之前被调用,相当于python中的__init__ 注意细节:(1)如果一个文件同时包含全局变量定义,init函数和main函数, ...