ES6 - 数组的遍历方式

89 阅读1分钟

ES5中数组的遍历方式

for循环

let arr = [1,2,3]
let arr2 = [1,2,2,3,4]
for(let i = 0; i < arr.length; i++){
   console.log(arr[i])                             
}

forEach() 没有返回值,只是针对每个元素调用func,不支持break、continue

// array为数组本身
arr.forEach(function(ele,index,array){
    console.log(ele,index,array);
})

同for循环的区别?

for循环中使用break结束所有循环

for(let i = 0; i < arr.length; i++){
    if(arr[i] === 2){
        break
    }
    console.log(arr[i])                 // 1                         
}

在forEach不支持break关键字,使用break会报错

arr.forEach(function(ele,index,array){
    if(arr[i] === 2){
        break
    }
    console.log(ele,index,array);     // Unsyntactic break 
})

那么分别在for循环和forEach中使用continue?(continue结束本次循环,开始下次循环)

for(let i = 0; i < arr.length; i++){
    if(arr[i] === 2){
        continue
    }
    console.log(arr[i])               // 1,3                    
}

arr.forEach(function(ele,index,array){
    if(arr[i] === 2){
        continue
    }
    console.log(ele,index,array);    // syntactic continue
})

map() 返回新的数组,每个元素为调用func的结果

arr.map(function(value){
    console.log(value);              //1,2,3
})

map和forEach有什么差别?

map的返回值会形成新的数组,并不会改变原有数组的值

let result = arr.map(function(value){
        value +=1
        return value;
    })
console.log(arr,result);               // [1, 2, 3]  [2, 3, 4]

filter() 返回符合func条件的元素数组

filter对数组中的数据按照条件进行过滤、筛选

filter()会返回符合筛选条件的数据组成新的数组数据

filter()并不会改变原来数组的值

let result = arr.filter(function(value){
    return value === 2
})
console.log(arr,result)                // [1, 2, 3] [2]

some() 返回boolean,判断是否有元素符合func条件

arr.some(function(value){
    console.log(value);   // 1,2,3
})

some只要在数组中找到一个符号条件的元素就会返回true,否则就返回false

some()并不会改变原有数组的数据

let result = arr.some(function(value){
    return value === 2
})
console.log(arr,result);             // [1, 2, 3] true

every() 返回boolean,判断每个元素都符合func条件

判断每个元素都符合func条件,如果都全部符合就返回true,只要存在一个不符合就返回false

every()并不会改变原有数组的值

let result = arr.every(function(value){
    return value === 2
})
console.log(arr,result);             // [1, 2, 3] false

reduce() 接收一个函数作为累加器(常用)

reduce(function(prev,cur,index,array){},initValue)

第一个参数是一个函数,函数中的第一个参数是上一次调用回调时对应的返回值;第二个参数是当前正在处理的数组中的元素;第三个参数是当前正在处理的数组所在的索引;第四个参数是原数组

第二个参数是一个初始值

// 数组求和
let sum = arr.reduce(function(pre,cur,index,array){
    return pre + cur
})
console.log(sum,arr);              // 6  [1, 2, 3]

// 求数组最大值
let result = arr.reduce(function(pre,cur){
        return Math.max(pre,cur)
})
console.log(result);              // 3

// 数组去重
let arr2 = [1,2,2,3,4]

let res = arr2.reduce(function(prev,cur){
    prev.indexOf(cur) === -1 && prev.push(cur)
    return prev
},[])
console.log(res);              // [1, 2, 3, 4]

不应该使用for...in去遍历数组

使用for...in去遍历数组,同时也会遍历到添加到Array原型上的自定义属性,但是这个结果并不是我们想要的

Array.prototype.foo = function(){
    console.log('foo')
}
for(let index in arr){
    console.log(arr[index])
}

image.png

ES6中数组的遍历方式

find(): 返回第一个通过测试的元素

let result = arr2.find(function(value){
    return value === 2
})
console.log(arr2,result);   // [1,2,2,3,4] 2   

findIndex(): 返回第一个通过测试的元素的索引

let result = arr2.findIndex(function(value){
    return value === 2
})
console.log(arr2,result);   // [1,2,2,3,4] 1  

for of(常用)

for(let item of arr2){
    console.log(item)    // [1,2,2,3,4]
}

values()

// 只得到值
for(let item of arr2.values()){
    console.log(item)    // [1,2,2,3,4]
}

keys()


// 只获取到下标
for(let item of arr2.keys()){
    console.log(item)   0,1,2,3,4
}

entries()

// 既有索引又有值
for(let [index,item] of arr2.entries()){
    console.log(index +'==>' + item)
}