Jquery使用each函数实现遍历及数组处理


Posted in jQuery onJuly 14, 2020

each()方法能使DOM循环结构简洁,不容易出错。each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组、多维数组、DOM, JSON 等等

在javaScript开发过程中使用$each可以大大的减轻我们的工作量。

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

each处理一维数组

var arr = [['a', 'aa', 'aaa'], ['b', 'bb', 'bbb'], ['c', 'cc', 'ccc']]   
 $.each(arr, function(i, item){   
   
$.each(item,function(j,val){
    

 alert(j);
    

alert(val);
   }); 
});

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

alert(val)将输出aaa,bbb,ccc

each处理二维数组

var arr2 = [['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']

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

var arr = [['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就有更厉害了,能循环每一个属性

var obj = { 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中有一段这样的代码

<input name="aaa" type="hidden" value="111" />
<input name="bbb" type="hidden" value="222" />
<input name="ccc" type="hidden" value="333" />
<input name="ddd" type="hidden" value="444"/>

然后你使用each如下

$.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将输出同样的结果

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

$("input:hidden").each(function(i,val){
  alert(i);
  alert(val.name);
  alert(val.value);    
});

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

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

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

看下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 相关文章推荐
利用jquery去掉时光轴头尾部线条的方法实例
Jun 16 jQuery
基于JQuery的Ajax方法使用详解
Aug 16 jQuery
使用jQuery实现简单的tab框实例
Aug 22 jQuery
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
jQuery简单判断值是否存在于数组中的方法示例
Apr 17 jQuery
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
jQuery实现的淡入淡出图片轮播效果示例
Aug 29 jQuery
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
Jquery如何使用animation动画效果改变背景色的代码
Jul 20 jQuery
js和jquery判断数据类型的4种方法总结
Aug 28 jQuery
jQuery 实现DOM元素拖拽交换位置的实例代码
Jul 14 #jQuery
jQuery开发仿QQ版音乐播放器
Jul 10 #jQuery
jQuery实现B2B网站后台管理系统侧导航
Jul 08 #jQuery
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 #jQuery
jQuery 实现扁平式小清新导航
Jul 07 #jQuery
jQuery 动态粒子效果示例代码
Jul 07 #jQuery
jQuery实现简单飞机大战
Jul 05 #jQuery
You might like
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
制作安全性高的PHP网站的几个实用要点
2014/12/30 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
深入理解vue-class-component源码阅读
2019/02/18 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
用JS实现选项卡
2020/03/23 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
简单实现Python爬取网络图片
2018/04/01 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
Python性能测试工具Locust安装及使用
2020/12/01 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
老师自我鉴定范文
2013/12/25 职场文书
幼儿园家长评语
2014/02/10 职场文书
交通工程专业推荐信
2014/09/06 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB