forEach
myArray.forEach(function(value){ console.log(value);});
实际上forEach有三个参数 分别为 值 下标 数组本身 于是我们有
[].forEach(function(value, index, array) {
});
forEach只是对数组中的每一项运行传入的函数,这个方法没有返回值,对原来数组也没有影响,但是我们可以自己通过数组的索引来修改原来的数组,本质上与for迭代数组一样。forEach不好用 你不能使用break语句中断循环,也不能使用return语句返回到外层函数。
兼容性写法:
/**
* forEach遍历数组
* @param callback [function] 回调函数;
* @param context [object] 上下文;
*/
Array.prototype.myForEach =functionmyForEach(callback,context){
context = context || window;
if('forEach'inArray.prototye) {
this.forEach(callback,context);
return;
}
//IE6-8下自己编写回调函数执行的逻辑
for(vari = 0,len =this.length; i < len;i++) {
callback && callback.call(context,this[i],i,this);
}
}
map
varary = [12,23,24,42,1];
varres = ary.map(function(item,index,input) {
returnitem*10;
})
console.log(res);//-->[120,230,240,420,10];
console.log(ary);//-->[12,23,24,42,1]
map和forEach非常相似,都是用来遍历数组中的每一项值的,用来遍历数组中的每一项;
map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);
不管是forEach还是map 都支持第二个参数值,第二个参数的意思是把匿名回调函数中的this进行修改。
兼容性写法:
/**
* map遍历数组
* @param callback [function] 回调函数;
* @param context [object] 上下文;
*/
Array.prototype.myMap =functionmyMap(callback,context){
context = context || window;
if('map'inArray.prototye) {
returnthis.map(callback,context);
}
//IE6-8下自己编写回调函数执行的逻辑
varnewAry = [];
for(vari = 0,len =this.length; i < len;i++) {
if(typeofcallback ==='function') {
varval = callback.call(context,this[i],i,this);
newAry[newAry.length] = val;
}
}
returnnewAry;
}
filter():
语法:
varfilteredArray = array.filter(callback[, thisObject]);
参数说明:
callback: 要对每个数组元素执行的回调函数。
thisObject : 在执行回调函数时定义的this对象。
//过滤掉小于 10 的数组元素:
//代码:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// 12, 130, 44
//结果:[12, 5, 8, 130, 44].filter(isBigEnough) : 12, 130, 44
功能说明:
对数组中的每个元素都执行一次指定的函数(callback),并且创建一个新的数组,该数组元素是所有回调函数执行时返回值为 true 的原数组元素。它只对数组中的非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽略,同时,新创建的数组也不会包含这些元素。
回调函数可以有三个参数:当前元素,当前元素的索引和当前的数组对象。
如参数thisObject被传递进来,它将被当做回调函数(callback)内部的 this 对象,如果没有传递或者为null,那么将会使用全局对象。
filter 不会改变原有数组,记住:只有在回调函数执行前传入的数组元素才有效,在回调函数开始执行后才添加的元素将被忽略,而在回调函数开始执行到最后一个元素这一期间,数组元素被删除或者被更改的,将以回调函数访问到该元素的时间为准,被删除的元素将被忽略。
some():
对数组中的每个元素都执行一次指定的函数(callback),直到此函数返回true,如果发现这个元素,some 将返回true,如果回调函数对每个元素执行后都返回 false ,some 将返回false。它只对数组中的非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽略。
//检查是否有数组元素大于等于10:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true
//结果:
//[2, 5, 8, 1, 4].some(isBigEnough) : false
//[12, 5, 8, 1, 4].some(isBigEnough) : true
every():
对数组中的每个元素都执行一次指定的函数(callback),直到此函数返回false,如果发现这个元素,every 将返回false,如果回调函数对每个元素执行后都返回 true ,every 将返回true。它只对数组中的非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽略。
//测试是否所有数组元素都大于等于10:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
//结果:
//[12, 5, 8, 130, 44].every(isBigEnough) 返回 : false
//[12, 54, 18, 130, 44].every(isBigEnough) 返回 : true
for...in...和for
数组既可以用for循环,也可以用for in循环(区别:for循环可以设置i的开始数字,可以从任何一个位置开始循环,但是for in循环不能设置,只能从第一个到最后一个进行循环)。
json只能用for in循环,因为json的下标是没有规律的字符串,没有length。
所以,一般数组就用for循环,json用for in循环。
循环遍历对象的key,是键值对前面的那一个哦
一般不推荐遍历数组,因为for in遍历后的不能保证顺序,而且原型链上的属性也会被遍历到,因此一般常用来遍历非数组的对象并且使用hasOwnProperty()方法去过滤掉原型链上的属性
var myArry =[1,2,3,4];
myArry.desc ='four';
for(var value in myArry){ //循环key
console.log(value)
}
//"0"
//"1"
//"2"
//"3"
//"desc" 注意这里添加上去的属性也被遍历出来了
for of遍历对象
循环遍历对象的值,是遍历键值对后面的那一个value哦 ,与for in遍历key相反
var myArry =[1,2,3,4];
myArry.desc ='four';
for(var value of myArry){
console.log(value)
}
//1
//2
//3
//4
这是最简洁、最直接的遍历数组元素的语法
这个方法避开了for-in循环的所有缺陷
与forEach()不同的是,它可以正确响应break、continue和return语句
网友评论