$.each()方法详解
$.each()方法详解
each()函数具有十分强大的遍历功能,可以遍历一维数组、多维数组、Dom、Json等。
在JavaScript中使用$.each可以大大减轻我们的工作量。
1.处理一维数组:
var arr = [ "a", "b", "c" ];
$.each(arr, function(i,val){
alert(i);
alert(val);
});
alert(i)将输出0,1,2
alert(val)将输出a,b,c
2.处理二维数组:
var arr = [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3'], ['c1', 'c2', 'c3']]
$.each(arr, function(i, item){
alert(i);
alert(item);
});
arr为一个二维数组,item相当于取这二维数组中的每一个数组。
item[0]相对于取每一个一维数组里的第一个值。
alert(i)将输出为:0,1,2,因为这二维数组含有3个数组元素
alert(item)将输出为:['a1', 'a2', 'a3'],['b1', 'b2', 'b3'],['c1', 'c2', 'c3']
对此二维数组的处理稍作变更之后:

var arr = [['a1', 'a2', 'a3'], ['b1', 'b2', 'b3'], ['c1', 'c2', 'c3']]
$.each(arr, function(i, item){
$.each(item,function(j,val){
alert(j);
alert(val);
});
});

alert(j)将输出为0,1,2、0,1,2、0,1,2
alert(val)将输出为a1,a2,a3、b1,b2,b3、c1,c2,c3
3.处理Json对象:
each处理json数据,这个each就有更厉害了,能循环每一个属性。
var obj = { one:1, two:2, three:3};
each(obj, function(key, val) {
alert(key);
alert(val);
});
alert(key)输出:one、two、three
alert(val)输出:1、2、3 (这个val等同于obj[key])
这边为何key不是数字而是属性呢,因为json格式内是一组无序的属性-值(键值对),既然无序,又何来数字呢。
4.处理Dom元素:
如果你Dom中有一段这样的代码:
<input name="a" type="hidden" value="1" />
<input name="b" type="hidden" value="2" />
<input name="c" type="hidden" value="3" />
然后使用each如下:
$.each($("input:hidden"), function(i,item){
alert(i);
alert(item);
alert(item.name);
alert(item.value);
});
alert(i)输出:为0,1,2
alert(item)输出:[object HTMLInputElement] //因为它是一个表单元素。
alert(item.name)输出:a,b,c //如果使用this.name将输出同样的结果
alert(item.value)输出:1,2,3 //如果使用this.value将输出同样的结果
上面代码另外的写法:(此形式运用到上面几段数组的操作也会输出同样的结果)
$("input:hidden").each(function(i,item){
alert(i);
alert(item.name);
alert(item.value);
});
5.从以上例子中可知:
1.jQuery和jQuery对象都实现了该方法。
2.对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法。
6.jQuery中的each实现:

function(object, callback, args) {
//该方法有三个参数:进行操作的对象obj,进行操作的函数fn,函数的参数args
var name, i = 0, length = object.length;
if (args) {
if (length == undefined) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break;
}
}
} else {
for (; i < length; ) {
if (callback.apply(object[i++], args) === false) {
break;
}
}
}
} else {
if (length == undefined) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break;
}
}
} else {
for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) { }
/*object[0]取得jQuery对象中的第一个DOM元素,通过for循环,
得到遍历整个jQuery对象中对应的每个DOM元素,通过 callback.call( value,i,value);
将callback的this对象指向value对象,并且传递两个参数,i表示索引值,value表示DOM元素;
其中callback是类似于 function(index, elem) { ... } 的方法。
所以就得到 $("...").each(function(index, elem){ ... });
*/
}
}
return object;
}

代码理解:
jQuery会自动根据传入的元素进行判断,然后在根据判断结果采取apply还是call方法的处理。在fn的实现中,可以直接采用this指针引用数组或是对象的子元素。
1.obj对象是数组
each方法会对数组中子元素的逐个进行fn函数调用,直至调用某个子元素返回的结果为false为止,也就是说,我们可以在提供的fn函数进行处理,使之满足一定条件后就退出each方法调用。当each方法提供了arg参数时,fn函数调用传入的参数为arg,否则为:子元素索引,子元素本身
2.obj 对象不是数组
该方法同1的最大区别是:fn方法会被逐次不考虑返回值的进行进行。换句话说,obj对象的所有属性都会被fn方法进行调用,即使fn函数返回false。调用传入的参数同1类似。
文章来源:jquery的each()详细介绍
随机推荐
- GitLab一键式安装bitnami
https://bitnami.com/stack/gitlab/installer https://bitnami.com/redirect/to/96764/bitnami-gitlab-8.5. ...
- CSS3制作精美的iphone电话图标,不使用图片
<!DOCTYPE HTML> <html lang=zh-cn> <head> <meta charset=utf-8> <title>C ...
- iOS8发展~Swift(三)UI详细解释
一个.总结 使用Swift去完成iOS的UI接口,事实上,目前的想法和OC实现几乎一致,只是在措辞非常大的差异,修改前更更大的个人控制.为有纯代码强迫症,所以接下来创建一个纯代码动项目,然后在此基础上 ...
- 不一样的味道--Html和Xml解析、格式、遍历
很多其它内容查看官网:http://www.tinygroup.org TinyXmlParser一切以简单.有用.高速为主. 演示样例1:Xml字符串解析 比方,我们要解析一段Xml字符串,简单例如 ...
- HDU 4333 Revolving Digits 扩张KMP
标题来源:HDU 4333 Revolving Digits 意甲冠军:求一个数字环路移动少于不同数量 等同 于的数字 思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 推断 nex ...
- CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
事件对象就像一个开关:它仅仅有两种状态---开和关.当一个事件处于"开"状态.我们称其为"有信号".否则称为"无信号". 能够在一个线程的运 ...
- StackExchange.Redis 使用-配置 (四)
Configurationredis有很多不同的方法来配置连接字符串 , StackExchange.Redis 提供了一个丰富的配置模型,当调用Connect 或者 ConnectAsync 时需要 ...
- POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT)
职务地址:id=3207">POJ 3207 找好矛盾关系.矛盾关系是(2,5)和(3,6)这两个仅仅能一个在外边,一个在里边.利用这个矛盾关系来建图. 能够用在外边和里边来当1和0, ...
- Git现实(一个)版本控制概述
从今天开始.我们了解的分布式版本控制系统Git相关内容.了解Git之前,我们的第一个版本控制系统,使宏观的描述. 什么是版本号控制 版本号控制是指通过对文件内容的变化进行记录,并为每次的变化进行编号, ...
- Android Studio中导入Android项目StepbyStep
想把在eclipse的项目导入Android studio,有两种方法,但是我喜欢的是不改变项目文件结构的方法,因为这样可以兼容eclipse. 第一步: 导入的项目不能运行,需要配置运行环境.And ...