常用的遍历
数组遍历 var a = [5, 2, 3];
for (value of a) { console.log(value) //5,2,3返回的是值 } for..of遍历内部的机制用到了迭代器
a.forEach(function(value,key, arr) { console.log(value,key,arr) // 返回的结果 5 0 [ 5, 2, 3 ] 2 1 [ 5, 2, 3 ] 3 2 [ 5, 2, 3 ] }) 如果是在回调中使用forEach(),可以给forEach()加上一个this参数 btn.onclick=function(){ a.forEach(function(value,key, arr) { console.log(value,key,arr) // 返回的结果 5 0 [ 5, 2, 3 ] 2 1 [ 5, 2, 3 ] 3 2 [ 5, 2, 3 ] },this) }
对象遍历 var obj = { “name”: “tom”, “age”: 22, “job”: “it” }; for (key in obj) { console.log(key); } Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名组成的数组,包括不可枚举属性但不包括Symbol值作为名称的属性 Object.keys(obj)返回一个给定对象的自身可枚举属性组成的数组,不可枚举的,不会被遍历。 for…in还会遍历原型链上的属性,返回的是每个属性key,不可枚举的,不会被遍历。
- […].some(ck)函数 —- 某个一个为true,则为true
对数组中每个元素执行一次ck函数,知道某个元素返回true,则直接返回true。如果都返回false,则返回false
检查整个数组中是否有满足ck函数的元素。
var result = [1,5,3,6].some( (v,i) => (v>10) ) //所有元素都不满足,返回result = false var result = [10,5,30,60].some( (v,i) => (v<10) ) //有一个(多个)满足,返回result = true —
2.[…].foreach(ck)函数 —- 循环而已
每个数组元素都执行一次ck函数,foreach函数无法用break跳出
[50, 25, 49].forEach( (v,i) => console.log(v) ); //50 25 49 —
3.[…].map(ck)函数 —- 返回每个元素返回值的集合
每个数组元素都执行一次ck函数,最后返回每次元素执行ck函数后返回值的集合(数组)
var newArray = [50,30,40].map( (v,i) => v/10 ) //每个元素除以10,最后返回一个新数组 newArray = [5,3,4] —
4.[…].filter(ck)函数 —- 得到返回值为true的元素的集合
每个数组元素都执行一次ck函数,最后返回每次元素执行ck函数后返回值的为true的元素集合(数组)
var newArray = [50,2,60,4,53,15].filter( (v,i) => (v>10) ) //返回数组中大于10的元素新数组 newArray = [50,60,53,15] —
5.[…].every(ck)函数 —- 某一个为false,则返回false
每个数组元素都执行一次ck函数,直到某个元素执行函数ck返回false,则直接返回false,如果全部返回true,则返回true
var result = [5,50,35,12,85].every( (v,i) => v<51 ) //返回有一个(多个)大于等于51,则返回 result = false var result = [5,50,35,12,85].every( (v,i) => v<100 ) //全部大于51,则返回 result = true —
6.[…].reduce(ck,init) —- 依次执行ck(prv.next)
数组依次执行ck函数。
var result = [0,1,2,3] restult.reduce((a,b)=> a+b,0) // 返回 6 —
操作数组的方法(pop push unshift shift splice reverse sort)indexOf lastIndexof concat slice forEach filter map some every reduce includes find
# forEach 不支持return 声明式 不关心如何实现
for in key会变成字符串类型 包括数组的私有属性 对象原型链上的属性也会打印出来
for of 支持return 并且是值of 数组 有iterator的 不能直接遍历对象
以下几个需要注意 是否操作原数组 返回结果 回调函数的返回结果 如果返回true 代表这一项放到数组中
[1,2,3,4,5].filter(item=>item>2&&item<4)
map 映射 讲原有数组映射成一个新数组 [1,2,3]=><li>1</li><li>2</li><li>3</li> 不操作原数组 返回新数组 回调函数中返回什么这一项就是什么
[1,2,3,4,5].map(item=><li>${item}</li>
).join(‘’)//”<li>1</li><li>2</li><li>3</li><li>4</li><li>5</li>”
includes arr.includes(item) 返回的是boolean
find 返回找到的那一项 不会改变数组 回调函数中返回true表示找到了 找到后停止循环
arr.find((item,index)=>item.toString().indexOf(具体要找的东西)>-1)//找到具体的某一项用find —
some 找true 找到true后停止 返回true
every 找false找到false后停止 返回false
reduce 收敛函数 收敛4个参数 返回的是叠加后的结果 原数组不发生变化 回调函数返回的结果
[1,2,3,4,5].reduce((prev,next,index,item)=>prev+next) return的本次 返回值 会作为下一次的prev // prev 代表的是数组的第一项 next是数组的第二项 —