js 数组循环操作方法

for  循环处理数据

for  循环处理数据是数组操作的基本方法

for (let index = 0; index < list.length; index++) {
    const element = list[index];
}

for循环处理数据的注意点

当数组里里面的值是对象类型时,数组里的每一项的属性是可以改变的

let listObj = [
    {
        name:'11',
        age:18
    },
     {
        name:'22',
        age:19
    },
    {
        name:'33',
        age:20
    },
     {
        name:'44',
        age:21
    },
    {
        name:'55',
        age:22
    },
     {
        name:'66',
        age:23
    }
]
for (let index = 0; index < listObj.length; index++) {
    const element = listObj[index];
    element.name=20//element 是对象类型 对象里的值可以改变
}

当数组里面的值是基本数据类型是(number,string等),数组里的每一项是不可以改变的


for (let index = 0; index < listNormal.length; index++) {
    let  element = listNormal[index];
    element="0"//值无法改变
}
console.log(listNormal)//][ '1', '2', '3', '4', '5' ]

for  如何跳出循环

  初始数据

let list=[
    '1','2','3','4','5'
]

     break

跳出当前循环,并结束后面所有的循环

for (let index = 0; index < list.length; index++) {
    let  element = list[index];
    if(element=='3'){
        break
    }
    console.log(element)// 1,2
 
}

   continue

跳出当前循环,继续后面的循环                

  for (let index = 0; index < list.length; index++) {
        let  element = list[index];
        if(element=='3'){
            continue
        }
        console.log(element)//1 2 4 5
    
    }

return  可以跳出多层循环

终止所有循环

let list = [
    '1', '2', '3', '4', '5'
]
let outList = [
    1, 2
]
for (let j = 0; j < outList.length; j++) {
    for (let index = 0; index < list.length; index++) {
        let element = list[index];
        if (element == '3') {
            break
        }
        console.log(element)//1 2 

    }
}

用return 跳出多层循环时,只会循环一次,

break 虽然也能跳出循环,但是仍然会执行多次

let list = [
    '1', '2', '3', '4', '5'
]
let outList = [
    1, 2
]
for (let j = 0; j < outList.length; j++) {
    for (let index = 0; index < list.length; index++) {
        let element = list[index];
        if (element == '3') {
            break
        }
        console.log(element)//1 2  12

    }
}

forEach

forEach可以理解为for的简写形式,循环的时候他有两个参数,一个是 当前项,另外一个是索引

forEach 基本用法同 for 但是

forEach 无法跳出循环 需要用 throw new Error 强制跳出循环

let listObj = [
    {
        name: '11',
        age: 18
    },
    {
        name: '22',
        age: 19
    },
    {
        name: '33',
        age: 20
    },
    {
        name: '44',
        age: 21
    },
    {
        name: '55',
        age: 22
    },
    {
        name: '66',
        age: 23
    }
]

listObj.forEach((ele,index)=>{
    console.log(ele,index)
})

/* { name: '11', age: 18 } 0
{ name: '22', age: 19 } 1
{ name: '33', age: 20 } 2
{ name: '44', age: 21 } 3
{ name: '55', age: 22 } 4
{ name: '66', age: 23 } 5 */

数据

let listObj = [
    {
        name: '11',
        age: 18
    },
    {
        name: '22',
        age: 19
    },
    {
        name: '33',
        age: 20
    },
    {
        name: '44',
        age: 21
    },
    {
        name: '55',
        age: 22
    },
    {
        name: '66',
        age: 23
    }
]

map 

映射处理每一条数据,会修改原数组

 对map的误区 

有人测试过map的执行时间比find filter some 的长,就误以为 map的执行效率低,实际上是因为,map必须映射处理每一条数据且不会跳出循环,而find和some查找到满足条件的元素就跳出循环了,所以相对而言 map似乎慢了 。我们需要具体问题具体分析,结合具体场景使用对应的方法

let listObj = [
    {
        name: '11',
        age: 18
    },
    {
        name: '22',
        age: 19
    },
    {
        name: '33',
        age: 20
    },
    {
        name: '44',
        age: 21
    },
    {
        name: '55',
        age: 22
    },
    {
        name: '66',
        age: 23
    }
]

let result = listObj.map(ele=>{
    return ele.age++
})

console.log(result)
// [ 18, 19, 20, 21, 22, 23 ]
console.log(listObj)
// [
//     { name: '11', age: 19 },
//     { name: '22', age: 20 },
//     { name: '33', age: 21 },
//     { name: '44', age: 22 },
//     { name: '55', age: 23 },
//     { name: '66', age: 24 }
//   ]

let result1= listObj.map(ele=>{
    let obj= Object.assign(ele,{sex:'男'})
    return obj 
})

console.log(result1)
/* 
[
  { name: '11', age: 19, sex: '男' },
  { name: '22', age: 20, sex: '男' },
  { name: '33', age: 21, sex: '男' },
  { name: '44', age: 22, sex: '男' },
  { name: '55', age: 23, sex: '男' },
  { name: '66', age: 24, sex: '男' }
] */
console.log(listObj)
 /* [
  { name: '11', age: 19, sex: '男' },
  { name: '22', age: 20, sex: '男' },
  { name: '33', age: 21, sex: '男' },
  { name: '44', age: 22, sex: '男' },
  { name: '55', age: 23, sex: '男' },
  { name: '66', age: 24, sex: '男' }
] */

filter  过滤

filter 过滤查找所有满足条件的元素 

filter不会修改原数组

let result2  = listObj.filter(ele=>ele.age >20)
console.log(result2)
/* 
[
  { name: '44', age: 21 },
  { name: '55', age: 22 },
  { name: '66', age: 23 }
]
*/
console.log(listObj)
/* 
[
  { name: '11', age: 18 },
  { name: '22', age: 19 },
  { name: '33', age: 20 },
  { name: '44', age: 21 },
  { name: '55', age: 22 },
  { name: '66', age: 23 }
]
*/

  some

some的返回值是boolean值,且只要有一个满足条件的值,就返回true,如果都不满足条件就返回false

let result2  = listObj.some(ele=>ele.age >20)
console.log(result2)//true

every

every的返回值是boolean值,必须所有的值都满足条件,才返回true,否则返回false

let result2  = listObj.every(ele=>ele.age >20)
console.log(result2)//false 

find

find 查找到满足条件的第一个元素,返回的不是数组而是一个元素

let result2  = listObj.find(ele=>ele.age >20)
console.log(result2)
/* 
{ name: '44', age: 21 }
*/

findIndex

find 查找到满足条件的第一个元素的索引

let result2  = listObj.findIndex(ele=>ele.age >20)
console.log(result2)//3

reduce

reduce 有两个参数 callBack,initalValue ,

callBack 是数组中每一个元素依次执行回调函数

initalValue是第一次调用callBack的第一个参数

callBack 参数

  1. prev 上一次带调用返回的值,或者提供的初始值
  2. cur 数组中当前被处理的元素
  3. index 当前元素的索引
  4. array 调用reduce的数组 

reduce求和,没有初始值

let list = [1,2,3,4]

let sum =   list.reduce((pre,cur,index,list)=>{
    return pre+cur
})
console.log(sum)//10

reduce求和 ,有初始值

let list = [1,2,3,4]
let sum1 = list.reduce((prev,cur,index,list)=>{
  return prev+cur  
},100)
console.log(sum1)

reduceRight

reduceRight用用法同reduce一致,只不过reduceRight是从右向左累加

注意

跳出循环的方法

自动跳出循环的方法  find,some
使用break,continue ,return 可以是for循环跳出循环

不会跳出循环的方法 map,every

使用 throw new Error 可以使 forEach 跳出循环

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值