js 数组循环遍历方法
在开发中经常和数组打交道,处理各种逻辑,了解数组遍历的使用方法后,我们要学会在合适的场景使用适合的方法
for循环
1 const arr = [1,2,3,4,5,6,7,8,9] 2 for (i = 0; len = arr.length; i < len; i++) { 3 console.log ( arr[i] ) 4 }
for遍历数组索引,如果数组中存在空元素,也会执行
可以使用return、break、continue跳出或中断循环
forEach
1 arr.forEach((item, index, arr) = > { 2 console.log ( item ) 3 })
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
forEach无法跳出循环(return、break、continue不起作用)
for ... of
1 const arr = [1,2,3,4,5,6,7,8,9] 2 for (const item of arr) { 3 if (item===3) break 4 console.log(item) // 1 2 5 } 6 7 const arr2 = [1,2,3,4,undefined,5,6,7] 8 for (const item of arr2) { 9 if (item===6) break 10 console.log(item) // 1 2 3 4 undefined 5 11 }
es6支持
for ... of 与for一样,如果遇到空元素同样会执行
和for一样可以使用return、break、continue终止循环
filter
1 const list = [ 2 {id:1, name:'张三', age:18}, 3 {id:2, name:'李四', age:22}, 4 {id:3, name:'赵六', age:30} 5 ] 6 const result = list.filter((item, index, arr)=>{ 7 return item.age === 22 8 })
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
filter配合return返回符合条件的新数组元素不可自定义,不会改变原数组,数组长度和原数组不同
map
1 const list = [ 2 {id:1, name:'张三', age:18}, 3 {id:4, name:'1111'}, 4 {id:2, name:'李四', age:22}, 5 {id:3, name:'赵六', age:30} 6 ] 7 const result = list.map((item, index, arr)=>{ 8 return item.age 9 })
console.log(result). // [{id:1, name:'张三', age:18},undefined,{id:2, name:'李四', age:22},{id:3, name:'赵六', age:30}]
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
有返回值,可以return出来
map返回新的数组元素可自定义,不会改变原数组,数组与原来长度一致
some
1 const list = [ 2 {id:1, name:'张三', age:18}, 3 {id:4, name:'1111'}, 4 {id:2, name:'李四', age:22}, 5 {id:3, name:'赵六', age:30} 6 ] 7 const result = list.some((item, index, arr)=>{ 8 return item.age===22 9 })
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
配合return使用,返回布尔值,某一元素满足条件返回true,循环中断,只有所有元素都不满足条件才返回false
every
1 const list = [ 2 {id:1, name:'张三', age:18}, 3 {id:4, name:'1111'}, 4 {id:2, name:'李四', age:22}, 5 {id:3, name:'赵六', age:30} 6 ] 7 const result = list.every((item, index, arr)=>{ 8 return !item.age 9 })
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
配合return使用,返回布尔值,与some相反,某一元素不满足条件返回false,循环中断,只有所有元素满足条件才返回true
find
1 const list = [ 2 {id:1, name:'张三', age:18}, 3 {id:4, name:'1111'}, 4 {id:2, name:'李四', age:22}, 5 {id:3, name:'赵六', age:22} 6 ] 7 const result = list.find((item, index, arr)=>{ 8 return item.age===22 9 })
console.log(result). // {id:2, name:'李四', age:22}
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
配合return使用,返回第一个满足条件的元素值,如果不存在返回undefined
findIndex
1 const list = [ 2 {id:1, name:'张三', age:18}, 3 {id:4, name:'1111'}, 4 {id:2, name:'李四', age:22}, 5 {id:3, name:'赵六', age:22} 6 ] 7 const result = list.findIndex((item, index, arr)=>{ 8 return item.age===22 9 }) 10 console.log(result). // 2
可以接收三个参数=> item:数组当前项的值,index:数组当前项的索引,arr:数组对象本身
配合return使用,用于找出第一个符合条件的数组成员位置(索引),如果没有找到返回-1
reduce
1 // 数组求和 2 const list = [ 3 {name:'张三', age:18}, 4 {name:'李四', age:62}, 5 {name:'王二', age:36}, 6 ] 7 const total = list.reduce((ageTotal, item) =>{ 8 return ageTotal + item.age 9 },0) 10 console.log(total) // 116 11 12 // 数组去重 13 const list = [ 14 {name:'王二', age:36}, 15 {name:'张三', age:18}, 16 {name:'李四', age:62}, 17 {name:'王二', age:36}, 18 {name:'李四', age:62}, 19 ] 20 const obj = {} 21 const result = list.reduce((array, item)=>{ 22 if ( obj[item.name] ){ 23 obj[item.age]++ 24 return array 25 } 26 obj[item.name] = 1 27 return [...array, item] 28 },[]) 29 console.log(result) //[{name:'王二', age:36}, {name:'张三', age:18},{name:'李四', age:62}]
方法接收两个参数,第一个回调函数(callback),第二个是初始值
其中回调函数接收四个参数:1、表示上一次回调时的返回值,或者初始值,2、表示当前正在处理的数组元素,3、表示当前正则处理的数组元素的索引,若提供初始值,则索引为0,否则索引为1(如果传入值为初始值,将从索引0开始,并从初始值的基础上累计执行回调函数,如果不传入初始值,该方法会从索引1开始执行回调函数),4、表示愿数组