each

$.each()与$(selector).each()不同, 后者专用于jquery对象的遍历, 前者可用于遍历任何的集合(无论是数组或对象),如果是数组,回调函数每次传入数组的索引和对应的值(值亦可以通过this 关键字获取,但javascript总会包装this 值作为一个对象—尽管是一个字符串或是一个数字),方法会返回被遍历对象的第一参数.

each()方法能使DOM循环结构简洁,不容易出错。each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组、多维数组、DOM, JSON 等等
在javaScript开发过程中使用$each可以大大的减轻我们的工作量。

each的几种常用的用法

each处理一维数组


1
2
3
4
5
vararr1 = [ "aaa","bbb", "ccc"]; 
$.each(arr1,function(i,val){ 
alert(i); 
alert(val);
});

alert(i)将输出0,1,2
alert(val)将输出aaa,bbb,ccc

each处理二维数组


1
2
3
4
5
  vararr2 = [['a','aa', 'aaa'], ['b','bb', 'bbb'], ['c','cc', 'ccc']] 
  $.each(arr,function(i, item){ 
alert(i); 
alert(item); 
  });

arr2为一个二维数组,item相当于取这二维数组中的每一个数组。
item[0]相对于取每一个一维数组里的第一个值
alert(i)将输出为0,1,2,因为这二维数组含有3个数组元素
alert(item)将输出为 ['a', 'aa', 'aaa'],['b', 'bb', 'bbb'],['c', 'cc', 'ccc']

对此二位数组的处理稍作变更之后


1
2
3
4
5
6
7
vararr = [['a','aa', 'aaa'], ['b','bb', 'bbb'], ['c','cc', 'ccc']] 
  $.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)将输出为a,aa,aaa,b,bb,bbb,c,cc,ccc

each处理json数据,这个each就有更厉害了,能循环每一个属性


1
2
3
4
5
  varobj = { one:1, two:2, three:3}; 
  each(obj,function(key, val) { 
  alert(key); 
  alert(val); 
  });

这里alert(key)将输出one two three
alert(val)将输出one,1,two,2,three,3
这边为何key不是数字而是属性呢,因为json格式内是一组无序的属性-值,既然无序,又何来数字呢。
而这个val等同于obj[key]

ecah处理dom元素,此处以一个input表单元素作为例子

如果你dom中有一段这样的代码


1
2
3
4
<inputname="aaa"type="hidden"value="111"/>
<inputname="bbb"type="hidden"value="222"/>
<inputname="ccc"type="hidden"value="333"/>
<inputname="ddd"type="hidden"value="444"/>

然后你使用each如下


1
2
3
4
5
6
$.each($("input:hidden"),function(i,val){ 
alert(val);
alert(i);
alert(val.name);
alert(val.value); 
});

那么,alert(val)将输出[object HTMLInputElement],因为它是一个表单元素。

alert(i)将输出为0,1,2,3

alert(val.name);将输出aaa,bbb,ccc,ddd,如果使用this.name将输出同样的结果
alert(val.value); 将输出111,222,333,444,如果使用this.value将输出同样的结果

如果将以上面一段代码改变成如下的形式


1
2
3
4
5
$("input:hidden").each(function(i,val){
alert(i);
alert(val.name);
alert(val.value); 
});

可以看到,输出的结果是一样的,至于两种写法究竟区别在哪,我也还不知。此改变运用到上面几段数组的操作也会输出同样的结果。

这样,几个例子的实际结果已经得到答案。接着再继续往下研究,总不能知其然不知其所以然。

从以上的例子中可知jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法。

看下jQuery中的each实现(网络摘抄)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function(object, callback, args) {
//该方法有三个参数:进行操作的对象obj,进行操作的函数fn,函数的参数args
varname, 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){ ... });
*/
}
}
returnobject;
}

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类似。


each函数根据参数的类型实现的效果不完全一致:

1、遍历对象(有附加参数)


1
2
3
4
$.each(Object,function(p1, p2) {
   this;   //这里的this指向每次遍历中Object的当前属性值
   p1; p2;  //访问附加参数
}, ['参数1','参数2']);

2、遍历数组(有附件参数)


1
2
3
4
$.each(Array,function(p1, p2){
   this;   //这里的this指向每次遍历中Array的当前元素
   p1; p2;  //访问附加参数
}, ['参数1','参数2']);

3、遍历对象(没有附加参数)


1
2
3
4
5
$.each(Object,function(name, value) {
   this;  //this指向当前属性的值
   name;  //name表示Object当前属性的名称
   value;  //value表示Object当前属性的值
});

4、遍历数组(没有附加参数)


1
2
3
4
5
$.each(Array,function(i, value) {
   this;  //this指向当前元素
   i;    //i表示Array当前下标
   value;  //value表示Array当前元素
});

下面提一下jQuery的each方法的几种常用的用法

Js代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vararr = [ "one","two", "three","four"];   
 $.each(arr,function(){   
  alert(this);   
 });   
//上面这个each输出的结果分别为:one,two,three,four  
vararr1 = [[1, 4, 3], [4, 6, 6], [7, 20, 9]]   
$.each(arr1,function(i, item){   
  alert(item[0]);   
});   
//其实arr1为一个二维数组,item相当于取每一个一维数组,  
//item[0]相对于取每一个一维数组里的第一个值  
//所以上面这个each输出分别为:1  4  7   
varobj = { one:1, two:2, three:3, four:4};   
$.each(obj,function(key, val) {   
  alert(obj[key]);      
});  
//这个each就有更厉害了,能循环每一个属性   
//输出结果为:1  2 3 4
09-03
<think> 首先,用户的问题是:“我想了解jQuery中$.each方法的相关信息,如使用方法、示例、注意事项等 请问jQuery $.each方法的使用和介绍”。用户要求提供关于jQuery $.each方法的详细信息。 从用户的引用中,有四个引用:[^1], [^2], [^3], [^4]。这些引用提供了与$.each方法相关的信息: - [^1]:描述了$.each()作为全局函数,用于遍历对象和数组。回调函数有两个参数:索引和值。可以通过返回false退出循环。 - [^2]:提到了$.each()和$.grep(),以及$().each()。$().each()用于DOM元素的遍历。 - [^3]:展示了$.each()用于遍历隐藏的input元素。 - [^4]:给出了使用$.each()遍历HTML表格的例子。 用户指定:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在系统指令中,没有“上一次的问题”,因为这是新的对话。系统指令是固定的,包括使用LaTeX格式、中文回答等。 系统级指令: 1. 所有行内数学表达式使用$...$格式。 2. 独立公式使用$$...$$格式。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 此外,用户可见层:回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 用户的问题是中文的,所以我需要用中文回答。 结构: 1. **引言**:简要介绍$.each方法。 2. **使用方法**:解释$.each的语法和参数。 3. **示例**:提供代码示例,展示如何遍历数组、对象和DOM元素。 4. **注意事项**:讨论常见的坑点、如何退出循环等。 5. **相关问题**:生成相关问题。 在引用中,区分了$.each(全局函数)和$().eachjQuery对象方法)。用户主要问$.each,但引用中提到了两者,所以我应该覆盖两者,但聚焦在$.each。 关键点: - $.each():用于遍历数组和对象。 - 语法:$.each(collection, callback) - 回调函数:function(index, value) 或 function(key, value) for objects. - 返回false退出。 - $().each():用于遍历jQuery对象(DOM元素)。 - 语法:$(selector).each(callback) - 回调函数:function(index, element) 在回答中,需要自然地添加引用标识。例如,提到特定点时,引用来源。 生成相关问题:在回答结束时,添加相关问题部分。 使用中文回答。 确保LaTeX:用户问题中没有数学表达式,但如果有,需要使用指定格式。这里可能不需要数学,但如果涉及数字或公式,要处理。否则,忽略。 完整结构: - 标题或开头:介绍jQuery $.each方法。 - 详细说明: - 什么是$.each? - 使用方法(语法)。 - 回调函数参数。 - 如何退出循环。 - 示例代码。 - 注意事项(如性能、兼容性)。 - 引用应用:在相关部分添加[^1], [^2]等。 - 结尾:简要总结。 - 相关问题:生成3-5个相关问题。 生成相关问题:例如: 1. $.each()和$().each()有什么区别? 2. 如何遍历嵌套对象使用$.each? 3. $.each()在性能方面有何考量? 4. 其他jQuery遍历方法如$.map()如何比较? 5. 在实际项目中常见的使用场景? 确保回答真实可靠:基于提供的引用和jQuery文档知识。$.each是标准的jQuery工具函数。 示例代码:从引用中提取或简化。 - 数组遍历示例。 - 对象遍历示例。 - DOM遍历示例。 注意事项: - $.each用于数组和对象,但$().each用于DOM。 - 退出循环:return false。 - 回调函数中this的上下文。 - 性能:对于大数据集,可能效率较低。 现在,草拟回答。 </think> ### jQuery $.each() 方法的使用和介绍 jQuery 是一个流行的 JavaScript 库,简化了 DOM 操作、事件处理和遍历。其中,$.each() 是一个全局函数,用于高效地遍历数组或对象。它不依赖于 jQuery 对象,而是直接操作数据集合,通过回调函数处理每个元素。下面我将逐步介绍$.each() 的使用方法、示例代码和注意事项,确保内容清晰可靠。 #### 1. **$.each() 方法的基本介绍** - **什么是$.each()?** $.each() 是 jQuery 提供的一个通用遍历函数,用于迭代数组或对象的元素。与 jQuery 对象的方法 $().each()(专门用于遍历 DOM 元素)不同,$.each() 是全局函数,操作更灵活[^1]。它接受两个参数: - 第一个参数:要遍历的数组或对象。 - 第二个参数:回调函数,处理每个元素。 回调函数签名:`function(index, value)`(用于数组)或 `function(key, value)`(用于对象)。其中: - `index` 或 `key`:元素的索引或键名。 - `value`:元素的值。 通过返回 `false` 可以提前退出循环,其他返回值会被忽略[^1]。 - **适用场景** $.each() 常用于处理 JSON 数据、数组遍历或迭代对象属性,但不适用于直接操作 DOM(此时应使用 $().each())[^2]。 #### 2. **使用方法** - **语法** ```javascript $.each(collection, callback); ``` - `collection`:可以是数组(如 `[1, 2, 3]`)或对象(如 `{name: "John", age: 30}`)。 - `callback`:回调函数,定义处理逻辑。 - **关键点** - **退出循环**:在回调函数中返回 `false` 可终止遍历(例如,满足特定条件时)[^1]。 - **上下文**:回调函数中的 `this` 指向当前元素的值(等同于 `value` 参数)。 - **返回值**:$.each() 本身返回原始集合,便于链式操作,但通常用于副作用(如修改数据)。 #### 3. **示例代码** 以下示例基于引用内容,展示 $.each() 的实际应用(运行于浏览器环境需引入 jQuery 库)。 - **示例 1:遍历数组** 遍历数组并打印每个元素及其索引。 ```javascript var colors = ["red", "green", "blue"]; $.each(colors, function(index, value) { console.log("索引: " + index + ", 值: " + value); }); // 输出: // 索引: 0, 值: red // 索引: 1, 值: green // 索引: 2, 值: blue ``` 此例演示了基本数组迭代[^1]。 - **示例 2:遍历对象** 遍历对象属性并处理数据。 ```javascript var user = {name: "Alice", age: 25, city: "Beijing"}; $.each(user, function(key, value) { console.log("属性: " + key + ", 值: " + value); }); // 输出: // 属性: name, 值: Alice // 属性: age, 值: 25 // 属性: city, 值: Beijing ``` 对象遍历时,第一个回调参数是键名而非索引[^1]。 - **示例 3:遍历 DOM 元素(结合 $().each() 对比)** 虽然 $.each() 不直接用于 DOM,但可以与 jQuery 选择器结合。例如,遍历所有隐藏的 `<input>` 元素: ```javascript var hiddenInputs = $("input:hidden"); // 获取 jQuery 对象 $.each(hiddenInputs, function(index, element) { console.log("索引: " + index + ", 元素名: " + element.name); // element 是原生 DOM 元素 }); ``` 注意:这里使用了 $.each() 遍历 jQuery 对象数组,但更推荐 $().each() 用于纯 DOM 操作(如 `$("input:hidden").each(...)`)[^3]。 - **示例 4:复杂数据遍历(摘自引用)** 遍历 HTML 表格的行和单元格: ```html <table id="myTable"> <tr><td>1</td><td>Satinder Singh</td></tr> <tr><td>2</td><td>Amit Sarna</td></tr> </table> <script> var tableData = []; $.each($("#myTable tr"), function(rowIndex, row) { var rowValues = []; $.each($(row).find("td"), function(cellIndex, cell) { rowValues.push($(cell).text()); }); tableData.push(rowValues); }); console.log(tableData); // 输出: [["1", "Satinder Singh"], ["2", "Amit Sarna"]] </script> ``` 此例展示了嵌套遍历,常用于数据提取[^4]。 #### 4. **注意事项** - **性能优化**: - 对于大型数组(超过 1000 元素),$.each() 可能比原生 JavaScript 的 `for` 循环慢。优先考虑性能时,使用 `Array.forEach()` 或普通循环。 - 避免在回调中执行耗时操作(如复杂计算)。 - **常见错误**: - **混淆 $.each() 与 $().each()**:$.each() 用于数据集合;$().each() 用于 jQuery 对象(如 DOM 元素)。例如,`$("div").each(...)` 是正确的 DOM 遍历方式[^2][^3]。 - **返回值忽略**:$.each() 回调中的返回值(除 `false` 外)无效;若要修改数组,需手动操作原集合。 - **作用域问题**:回调函数内的 `this` 指向元素值,而非全局对象。使用箭头函数可能导致 `this` 丢失,建议用 `function` 关键字。 - **兼容性和限制**: - 适用于 jQuery 1.0+ 版本。确保在项目中加载 jQuery 库。 - 不支持异步遍历;对于异步操作,需结合 Promise 或其他方法。 这些注意事项基于 jQuery 最佳实践[^1][^2]。 #### 总结 jQuery 的 $.each() 是一个强大的遍历工具,适用于数组和对象的迭代,语法简洁灵活。通过回调函数,开发者可以高效处理数据集合,但需注意与 $().each() 的区别和性能考量。对于 DOM 操作,优先使用 $().each() 方法以确保最佳实践[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值