1、for循环
返回值:无
最常用也是最简单的遍历方式,可以使用break或者continue终止,一个优化的方法是把length保存起来,避免重复获取,当数组长度很大时会体现出优化效果。
let arr = [1,2,3,4,5,6];
for(let i = 0, len = arr.length;i < len; i++){
if(arr[i] > 4) {
break;
}
console.log(arr[i]);
// 1
// 2
// 3
// 4
}
tips:
break结束循环;
continue结束本次循环,意为其后代码不执行,但是循环继续。
2、for of循环
返回值:无
for of是es6新增的遍历数据的方式,它的原理是循环内部调用数据结构的Symbol.iterator
方法,所以它可以遍历字符串、对象、Set和Map结构、数组以及类数组对象。当它遍历数组时,获取的是数组的值。它也可以使用break或者continue跳出循环。
let arr = [1, 2];
for(let value of arr){
console.log(value); // 1 2
}
知识点:阮一峰for of循环
3、forEach()
返回值:无
forEach()是ES5的方法,它对数组中的每一项运行给定的函数,没有返回值,本质上与使用for循环迭代数组一样。不能使用break或者continue跳出循环,return无效。
let arr = [1, 2];
const a = () => {
arr.forEach((item, index, arr) => {
/* item 数组每一项
index 索引
arr 数组本身
*/
return item === 1
});
}
console.log(a()); // undefined
4、map()
返回值:array
map()对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组,不改变原数组。
let arr = [1, 2];
const newArr = arr.map((item, index, arr) => {
return item * 3
});
console.log(newArr); // [3, 6]
console.log(arr); // [1, 2]
5、filter()
返回值:array
filter()对数组中的每一项运行给定的函数,返回该函数会返回true的项组成的数组,不改变原数组。如果函数每一项都返回false,那么filter()会返回空数组。
let arr = [1, 2];
const newArr = arr.filter((item, index, arr) => {
return item > 1
});
console.log(newArr); // [2]
console.log(arr); // [1, 2]
6、every()
返回值:boolean
every()对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true。
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const value = arr.every((item, index, arr) => {
return item > 4
});
console.log(value); // false
7、some()
返回值:boolean
some()对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const value = arr.some((item, index, arr) => {
return item > 4
});
console.log(value); // true
8、find()
返回值:any
find()找出符合条件的第一个数组成员并返回该成员。如果没有符合条件的成员则返回undefined。
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const value = arr.find((item, index, arr) => {
return item % 2 === 0
});
console.log(value); // 2
const value1 = arr.find((item, index, arr) => {
return item >10
});
console.log(value1); // undefined
9、findIndex()
返回值:number
findIndex()找出符合条件的第一个成员的位置,如果都不符合条件则返回-1。
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const value = arr.findIndex((item, index, arr) => {
return item > 5
});
console.log(value); // 5
const value1 = arr.findIndex((item, index, arr) => {
return item > 15
});
console.log(value1); // -1
10、reduce()和reduceRight()
返回值:any
这两个方法是ES5新增的归并方法,它们会迭代数组的所有项然后构建一个最终返回的值。reduce()从数组的第一项开始,逐个遍历到最后,而reduceRight()是从数组的最后一项开始,向前遍历到第一项。它们都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。它们不回改变原数组,在数组求和时非常有用。
传给它们的函数接收4个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const value = arr.reduce((prev, cur, index, arr) => {
return prev + cur
});
console.log(value); // 55
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const value = arr.reduceRight((prev, cur, index, arr) => {
return prev + cur
}, 10);
console.log(value); // 65
11、keys()、values()、entries()
返回值:无
它们是ES6提供的新方法,均会返回遍历器对象,可以用for... of遍历,区别是keys()是对键名的遍历,values()是对键值的遍历,entries()是对键值对的遍历。
let arr = [1, 2, 3];
for(let index of arr.keys()){
console.log(index); // 0 1 2
}
for(let value of arr.values()){
console.log(value); // 1 2 3
}
for(let [index, item] of arr.entries()){
console.log(index, item); // 0 1, 1 2, 2 3
}
由此发现省略数组方法时,其实默认是调用values(),跟2中的for of结果一致。
知识点:阮一峰es6数组遍历
简易小demo
let arr = [{
id: 1,
name: 'hello',
age: 20
}, {
id: 2,
name: 'hello world',
age: 23
}, {
id: 3,
name: 'hello sakura',
age: 27
},
5,
6,
7,
7];
const dArr = Array.from(new Set(arr));
const newArr = dArr.map((item, index,arr) => {
if(item.age) {
return item.age
} else {
return item * 3
}
})
newArr.sort((a, b) => b - a)
console.log(newArr); // [ 27, 23, 21, 20, 18, 15 ]
简单的说
虽然网上关于数组遍历的文章铺天盖地,但是看得再多,始终是别人的,方法如此之多,光看是记不住的,唯有自己摸索才能记得更牢,所谓好记性不如烂笔头。本篇文章过于基础,不喜勿喷。