javascript 中的那些遍历方法

老生常谈的问题,在面试和实战中都是高频点,我也是为了回忆和巩固才写这篇文章

数组中相关的:

for循环

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
for(let i = 0, len = objs.length; i<len; i++) {
  console.log(`obj[${i}]:`, objs[i])
}
//结果:
obj[0]: {name: "mary", age: 12}
obj[1]: {name: "lisa", age: 13}
obj[2]: {name: "luck", age: 14}

for of

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
for(let obj of objs) {
  console.log(obj)
}
//output:
{ name: 'mary', age: 12 }
{ name: 'lisa', age: 13 }
{ name: 'luck', age: 14 }

for in

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
for(let idx in objs) {
  console.log(idx, objs[idx])
}
//output:
0 { name: 'mary', age: 12 }
1 { name: 'lisa', age: 13 }
2 { name: 'luck', age: 14 }for of 不同的是 遍历的是索引

forEach

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
objs.forEach((obj, idx, arr)=>{
  console.log(obj, idx, arr)
})
//output:
{ name: 'mary', age: 12 } 0 [
  { name: 'mary', age: 12 },
  { name: 'lisa', age: 13 },
  { name: 'luck', age: 14 }
]
{ name: 'lisa', age: 13 } 1 [
  { name: 'mary', age: 12 },
  { name: 'lisa', age: 13 },
  { name: 'luck', age: 14 }
]
{ name: 'luck', age: 14 } 2 [
  { name: 'mary', age: 12 },
  { name: 'lisa', age: 13 },
  { name: 'luck', age: 14 }
]

map

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
const res = objs.map((obj, idx, arr)=>obj)
console.log('res: ', res)
//output:
res:  [
  { name: 'mary', age: 12 },
  { name: 'lisa', age: 13 },
  { name: 'luck', age: 14 }
]
返回一个计算后的数组

filter

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
const res = objs.filter((obj, idx, arr)=>obj.name === 'mary')
console.log('res: ', res)
//output:
res:  [ { name: 'mary', age: 12 } ]
返回一个数组,数组中包含所有满足条件的对象

some

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
const res = objs.some((obj, idx, arr)=>obj.age >= 13)
console.log('res: ', res)
//output:
res:  true
数组中只要有1个对象满足条件就会返回

every

数组中每个对象都满足条件才会返回true

  • find

查找出数组中第一个满足条件的对象,并返回

  • findIndex

查找出数组中第一个满足条件的对象索引,并返回

reduce/reducPrev/reduceNext

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
const res = objs.reduce((prev, cur, curIdx)=>{
  return prev + cur.age
}, 0)
console.log(res)
//output:
39
//用于累计的用法

var objs = [
  {name: 'mary', age: 12},
  {name: 'lisa', age: 13},
  {name: 'luck', age: 14},
]
const res = objs.reduce((prev, cur, curIdx)=>{
  prev[cur.name] = cur
  return prev
}, {})
console.log(res)
//output:
{
  mary: { name: 'mary', age: 12 },
  lisa: { name: 'lisa', age: 13 },
  luck: { name: 'luck', age: 14 }
}
//用于构造map的用法

reduce((prev, cur, curIdx)=>{}, initV)
initV未prev的初始值

对象相关

for in

var obj = {
  name: 'mary',
  age: '14',
  sex: 'male',
  job: 'student',
  hobby: 'reading'
}
for(let attr in obj) {
  console.log(attr, obj[attr])
}
//output:
name mary
age 14
sex male
job student
hobby reading

for in 可以遍历可遍历对象的所有属性

Object.keys()

var obj = {
  name: 'mary',
  age: '14',
  sex: 'male',
  job: 'student',
  hobby: 'reading',
  xxx: null
}
console.log(Object.keys(obj))
//output:
[ 'name', 'age', 'sex', 'job', 'hobby', 'xxx' ]

返回一个对象所有索引组成的数组

Object.values()

var obj = {
  name: 'mary',
  age: '14',
  sex: 'male',
  job: 'student',
  hobby: 'reading',
  xxx: null
}
console.log(Object.values(obj))
//output:
[ 'mary', '14', 'male', 'student', 'reading', null ]
返回一个对象所有索引值组成的数组

Object.entrys()

var obj = {
  name: 'mary',
  age: '14',
  sex: 'male',
  job: 'student',
  hobby: 'reading',
  xxx: null
}
console.log(Object.entries(obj))
//output:
[
  [ 'name', 'mary' ],
  [ 'age', '14' ],
  [ 'sex', 'male' ],
  [ 'job', 'student' ],
  [ 'hobby', 'reading' ],
  [ 'xxx', null ]
]
返回一个给定对象自身可枚举属性的键值对数组

以上就是笔者所掌握和平常使用的,有遗漏的地方可以补充哦

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值