1. forEach
结合代码看看这种遍历:
var arr = [1,2,3,4,5]
arr.forEach((item) => {
item = item*2 // 试着在遍历里面改变数组项
})
console.log(arr) // 为原数组
说明foreach并不会改变原数组,下面试着它会不会返回新的东西
arr = arr.forEach((item) => {
return item = item*2
})
console.log(arr) // undefined
打印出来是undefined,说明这个遍历方法也不会返回新值。
但是超人鸭之前试过用foreach改变过数组呀,是我记错了吗,突然想起来,之前改变的都是对象数组,看下面的例子:
var objArr = [{a:1},{a:2},{a:3}]
objArr.forEach((item) => {
item.a = item.a*2
})
console.log(objArr) // 出现浅拷贝,2,4,6
可以看到如果对象数组去遍历的话,是会出现浅拷贝,如果你给这个对象添加新属性也是会生效的。所以如果是处理对象数组,就可以用foreach去处理。
那如果不是对象数组呢,想要用foreach改变原数组呢?
foreach有三个参数,第一个是每个数组项,第二个是下标索引,第三个是数组本身,所以可以这么做:
arr.forEach((item,i,arr) => {
arr[i] = item * 2
})
console.log(arr) // 2,4,6,8,10
可以直接用改变数组本身的方法去改变数组。foreach就说这么多。
2.map
map和foreach不一样的是,它会返回一个新数组。
var arr = [1,2,3,4,5]
arr = arr.map((item) => {
return item*2
})
console.log(arr) // 2,4,6,8,10
可以看到map会返回一个新数组,注意在遍历里面要return,如果不return就会出现一个数组项都是undefined的数组。
和foreach一样的是,遍历过程不会改变原数组:
var arr = [1,2,3,4,5]
arr.map((item) => { // map不会改变原数组
item = item*2
})
console.log(arr) // 1,2,3,4,5
一样去遍历对象数组会出现浅拷贝:
var objArr = [
{a:1,b:3},
{a:2,b:4},
{a:5,b:7}
]
let objArr2 = objArr.map((item) => {
item.a = item.a*2
item.b = item.b*3
return item
})
console.log(objArr2)
console.log(objArr) // 出现浅拷贝,和objArr2一样
3.some
some这种遍历数组方法返回的是一个Boolean型的值,当其中一个数组项符合条件时,整个some遍历就会返回ture。描述看不懂,直接看代码。
var arr = [1,2,3,4,5]
var test = arr.some((item) => {
return item == 3
})
console.log(test) // true
看到有一个数组项符合条件时就会返回true,这里还有一个要注意的点,当some返回true后,就会停止遍历:
arr.some((item) => {
if(item == 3) {
return true
}
console.log(item) //1,2 // return true的时候就停止遍历
})
如果遍历过程中不返回的话,some会返回什么呢?
var arr = [1,2,3,4,5]
var test = arr.some((item) => {
item = item * 2
})
console.log(test) // false
也很好理解,没有返回就是相当返回undefined。some当全部遍历都没有返回ture的时候就会返回false
上面说到当某一次遍历返回true的时候,some就会停止遍历,那当遍历时候返回false呢:
var arr = [1,2,3,4,5]
arr.some((item) => {
if(item == 3) {
return false
}
console.log(item) //1,2,4,5 // return false的时候会跳过此次遍历,执行下一次
})
可以看到返回遍历返回false的时候并不会停止遍历,但是会跳出那一次遍历,其实就是return的作用。
4.every
every和some用法相似,不同的是,some是有一次遍历返回true的时候,some就会返回true,every是要每一次遍历都返回true时才会返回true:
var arr = [1,2,3,4,5]
var test1 = arr.every((item) => {
return item > 1
})
console.log(test1) // false
var test2 = arr.every((item) => {
return item > 0 // 需要每一次遍历都返回true结果才是true
})
console.log(test2) // true
5.filter
filter就是过滤,它会返回一个新数组,是由遍历时符合条件的数组项组成:
var arr = [1,2,3,4,5]
arr = arr.filter((item) => {
return item > 3
})
console.log(arr) // 4,5
这里看起来很好理解,但是和上面说的map有点区别,filter是返回符合条件的数组项组成的数组,map是映射,把数组项映射成新的内容,不要搞混哦:
var arr = [1,2,3,4,5]
let arr1 = arr.map((item) => {
return 1
})
console.log(arr1) // 1,1,1,1,1
let arr2 = arr.filter((item) => {
return 1 // 就是retrun true
})
console.log(arr2) // 1,2,3,4,5
6.findIndex
findIndex就是查找索引,找到符合条件的数组项的下标,并且找到第一个符合条件后就停止遍历:
var arr = [1,2,3,4,5]
var index = arr.findIndex((item) => {
if(item === 2) {
return true
}
})
console.log(index) // 1
超人鸭这次就说这几种数组遍历的方法,需要注意的点上面都有说到,还有一点就是基本每一种遍历都有三个参数,数组项、下标、数组本身。
网友评论