JS forEach()和map()遍历,jQuery$.each()和$.map()遍历

本文对比了原生JavaScript中的forEach()与map()方法及jQuery中的.each()与.map()方法的功能与用法。介绍了这些方法如何遍历数组与对象,以及它们在返回值方面的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原生JS forEach()和map()遍历 

共同点:

  • 都是循环遍历数组中的每一项。 
  • forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组array。 
  • 匿名函数中的this都是指Window。 
  • 只能遍历数组。

 forEach()方法:(没有返回值)

arr[].forEach(function(value,index,array){
  //do something
})
  • 参数:value数组中的当前项; index当前项的索;array原始数组;
  • 数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
  • 理论上这个方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来数组进行修改;但是可以自己通过数组的索引来修改原来的数组;
1  var arr = [12, 23, 24, 42, 1];
2         var res = arr.forEach(function(value, index, arrNew) {
3             arrNew[index] = value * 10;
4         })
5         console.log(res); //-->undefined;
6         console.log(arr); //-->[120,230,240,420,10]; 通过数组索引改变了原数组

 map()方法:(没有返回值,可以return出来)

arr[].map(function(value,index,array){
  //do something
})
  • 参数:value数组中的当前项; index当前项的索引;array原始数组;
  • 区别:map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);
1  var arr = [12, 23, 24, 42, 1];
2         var res = arr.map(function(vlaue, index, arrNew) {
3             return vlaue * 10;
4         })
5         console.log(res); //-->[120,230,240,420,10]; 原数组拷贝了一份,并进行了修改
6         console.log(arr); //-->[12,23,24,42,1]; 原数组并未发生变化

 

二、jQuery .each().map()遍历

共同点:

      即可遍历数组,又可遍历对象;

$.each()方法:(没有返回值)

$.each(arr, function(index,element ){
  //do something
})
  • 参数  index当前项的索引;element 数组中的当前项
  • 注意:第1个和第2个参数正好和以上两个函数是相反的;

 遍历数组:

1 var arr = [12, 23, 24, 42, 1];
2         $.each(arr, function(index, value) {
3             console.log(index) // 0 1 2 3 4
4             console.log(element ) // 12 23 24 42 1
5         })

 遍历对象:

1 $.each({ name: "John", lang: "JS" }, function(k, n) {
2             console.log("Name: " + k + ", Value: " + n);
3         });
4         //Name: name, Value: John 
5         // Name: lang, Value: JS

$.map()方法:(没有返回值,可以return出来)

  • 参数: index当前项的索引;element 数组中的当前项

遍历数组:

1 var arr = $.map([0, 1, 2], function(index, element) {
2             return index + element;
3         });
4         console.log(arr);

 遍历对象:

1 $.map({ "name": "Jim", "age": 17 }, function(name, vlaue) {
2             console.log(name + ":" + vlaue);
3         });
4         //Jim:name
5         //17:age

 

转载于:https://www.cnblogs.com/caiyuqin/p/7483545.html

<think>好的,我现在需要回答用户关于c:forEachjQuery.each的区别及用法对比的问题。首先,我得先理解这两个东西各自的用途上下文。 用户提供的引用资料里提到,c:forEachJSTL标签,用于在JSP页面上循环遍历数据,生成HTML内容。比如引用[1][5]中,用户遇到了在c:forEach中使用相同id导致jQuery只能获取第一个元素的问题,这说明c:forEach是在服务器端渲染生成多个HTML元素的。而引用[2][3]提到jQuery的each方法则是用来遍历DOM元素集合,对每个元素执行操作。引用[4]则是在处理c:forEach生成元素时的事件绑定问题,可能涉及客户端脚本的执行。 接下来,我需要比较两者的区别。首先,c:forEach是服务端标签,运行在服务器,生成HTML;而jQuery.each是客户端JS库的方法,操作的是浏览器中的DOM。两者的执行环境不同,职责也不同。c:forEach用于动态生成页面内容,而jQuery.each用于处理用户交互或动态修改页面。 然后,考虑用法对比。比如,c:forEach通常用在JSP中循环展示数据,例如生成表格行。而jQuery.each则用于遍历选中的元素,比如所有类名为.item的元素,进行事件绑定或修改内容。 另外,要注意到用户提到的常见问题,如重复id导致jQuery只能获取第一个元素,这时候应该用class代替id,或者在服务端生成唯一的id。这也是两者结合使用时需要注意的地方。 最后,需要总结它们的适用场景如何配合使用。比如,服务端生成结构,客户端处理交互。还要给出相关问题,比如如何解决重复id的问题,或者如何优化循环性能等。 现在需要组织这些点,用清晰的结构例子说明两者的区别,并引用提供的资料作为示例。同时确保符合格式要求,如行内公式用$,独立公式用$$,但在这个问题中可能不太涉及数学公式,但要注意代码块的使用。</think>### c:forEach vs jQuery.each 区别及用法对比 #### 一、核心区别 | 特性 | c:forEach (JSTL) | jQuery.each (JavaScript) | |--------------------|----------------------------------------|---------------------------------------| | **执行环境** | 服务器端(JSP/Servlet)生成静态HTML[^1] | 客户端浏览器动态操作DOM[^2] | | **数据来源** | 后端Java集合(如List、Map)[^5] | 前端DOM元素集合或JSON数据 | | **输出结果** | 直接生成HTML内容[^1][^5] | 动态修改现有DOM结构[^3] | | **ID处理** | 容易产生重复ID(需手动拼接唯一值) | 要求选择器匹配唯一/多个元素[^2] | #### 二、典型用法对比 1. **c:forEach 示例 - 生成商品列表** ```jsp <table> <c:forEach items="${products}" var="product"> <tr class="product-row" id="prod_${product.id}"> <!-- 拼接唯一ID --> <td>${product.name}</td> <td>$${product.price}</td> </tr> </c:forEach> </table> ``` *通过服务器端数据生成静态表格,注意用表达式拼接唯一ID避免冲突* 2. **jQuery.each 示例 - 动态计算总价** ```javascript $(".product-row").each(function() { total += parseFloat($(this).find("td:eq(1)").text().replace('$','')); }); ``` *遍历类名为`product-row`的元素进行客户端计算* #### 三、常见问题解决方案 1. **重复ID问题** - ❌ 错误写法:`id="product"`(多个重复ID) - ✅ 正确方案:使用`class`选择器或拼接唯一值 ```jsp <c:forEach items="${items}" varStatus="loop"> <div class="item" id="item_${loop.index}">...</div> </c:forEach> ``` 2. **事件绑定问题** - ❌ 错误写法:`onclick="handle(${obj})"`(可能产生JS语法错误)[^4] - ✅ 正确方案:通过jQuery委托事件 ```javascript $(document).on('click', '.item', function() { var id = $(this).attr('id').split('_')[1]; }); ``` #### 四、性能对比 $$ T_{render} = N \times t_{server} \quad vs \quad T_{process} = M \times t_{client} $$ - `c:forEach`渲染时间与数据量$N$正相关 - `jQuery.each`处理时间与元素量$M$正相关 - 最佳实践:服务端渲染基础结构 + 客户端处理动态交互
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值