$.each是一个通用的迭代函数,可以用来迭代数组与对象。
$.each(arr,function(index,value){
……
})
$.each(obj,function(prop,value){
……
})
$.each()
函数和 $(selector).each()
是不一样的,那个是专门用来遍历一个jQuery对象。$.each()函数可用于迭代任何集合,无论是“名/值”对象或数组。
那么我们该怎么实现这样一个 each 方法呢?
首先,我们肯定要根据参数的类型进行判断,如果是数组,就调用 for 循环,如果是对象,就使用 for in 循环。
function each(obj,callback){
if(Array.isArray(obj)){
for(var i=0;i<obj.length;i++){
callback.call(obj[i],i,obj[i]);
}
}else{
for(var prop in obj){
callbackcall(obj[prop],prop,obj[prop]);
}
}
}
使用call调用回调函数是为了保证this的正确指向。
这个函数看起来与原生的forEach方法没有什么区别,但是$.each是支持在回调函数中返回return false来终止循环的。
这里我们也可以通过监测callback返回的值来实现:
function each(obj,callback){
if(Array.isArray(obj)){
for(var i=0;i<obj.length;i++){
if(callback(i,obj[i]) === false){
break;
}
}
}else{
for(var prop in obj){
if(callback(prop,obj[prop]) === false){
break;
}
}
}
}