深入浅析JS的数组遍历方法(推荐)


Posted in Javascript onJune 15, 2016

用过Underscore的朋友都知道,它对数组(集合)的遍历有着非常完善的API可以调用的,_.each()就是其中一个。下面就是一个简单的例子:

var arr = [1, 2, 3, 4, 5];
_.each(arr, function(el) {
console.log(el);
});

上面的代码会依次输出1, 2, 3, 4, 5,是不是很有意思,遍历一个数组连for循环都不用自己写了。_.each()方法遍历数组非常好用,但是它的内部实现一点都不难。下面就一起来看看到底是如何实现_.each()的。在这之前,我们先来看看_.each()的API。_.each()的一般是如下调用的:

_.each(arr, fn, context);

它接收3个参数,

第一个是需要遍历的数组(其实是对象也是可以的,这个后面我们再一起来讨论);

第二个是它的回调函数(这个回调函数可以传入3个参数,如:function(el, i, arr),分别是当前元素、当前索引和原数组);

第三个是回调函数需要绑定到的上下文,即指定回调函数fn的this值。

好啦,需求已经非常明确了,开始干活啦!

我们先来实现一个最简单的_.each(),它不能够修改上下文this的,接收两个参数,代码如下:

var _ = {}; // 假设这就是underscore哈
// 一个最简单的_.each方法的实现
_.each = function(arr, fn) {
for(var i = 0; i < arr.length; i++) {


fn(arr[i], i, arr);

}

return arr; // 把原数组返回
}

怎么样?是不是很简单呢?只是用一个for循环,不停的调用回调函数即可,短短几行代码就搞定了,相信没有朋友看不懂的哈!下面我们来测试一下看能不能正常工作:

var arr = [1, 2, 3, 4, 5];
_.each(arr, function(el, i, arr) {
console.log(el);
});

在浏览器打开,然后控制台就会看到有正确的输出了。

这么简单的代码一点意思也没有,接下来看一个比较有点挑战性的例子哈。比如,数组arr有个sum属性,我们需要把数组所有的元素求和之后存放到sum里面,如下:

var arr = [1, 2, 3, 4, 5];
arr.sum = 0; // sum属性用来存放数组元素之和
_.each(arr, function(el, i, arr) {
this.sum += el;
});

这时候,回调函数里面用到了this,如果不绑定的话,this默认就是window,这不是我们想要的,我们希望它绑定到数组arr上面。call或者apply可以实现这个功能,代码如下:

var _ = {}; // 假设这就是underscore哈
// bind,接收两个参数fn和context
// 把fn绑定到context上面
var bind = function(fn, context) {
context = context || null;

return function(el, i, arr) {


fn.call(context, el, i, arr);

}
}
// _.each
_.each = function(arr, fn, context) {

// 调用bind方法,把fn绑定到context上面

fn = bind(fn, context);

for(var i = 0; i < arr.length; i++) {


fn(arr[i], i, arr);

}

return arr;
}
// 测试用例:
var arr = [1, 2, 3, 4, 5];
arr.sum = 0; // sum属性用来存放数组元素之和
_.each(arr, function(el, i, arr) {

this.sum += el;
}, arr);
console.log(arr.sum); // 15

好啦,这个_.each()已经足够强大了,可以正常遍历数组,还可以任意指定this值改变回调函数的上下文。但是,我们前面有提到过,Underscore的_.each()还可以遍历对象的 ,这个实现也不难,只要判断一下传入的第一个参数是对象还是数组,如果是数组就像我们一样遍历,否则如果是对象,使用对象的for...in循环遍历就行了。有兴趣的可以自己试试,或者看看underscore的源码。

注意:自从ES5标准以来,原生数组就已经具有了Array.prototype.forEach、Array.prototype.Map等遍历方法了,在项目中可以使用原生的。

以上所述是小编给大家介绍的深入浅析JS的数组遍历方法(推荐)的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
2007/12/23更新创意无限,简单实用(javascript log)
Dec 24 Javascript
jquery 表单下所有元素的隐藏
Jul 25 Javascript
jquery 可排列的表实现代码
Nov 13 Javascript
使用firebug进行调试javascript的示例
Dec 16 Javascript
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
Jquery 获取指定标签的对象及属性的设置与移除
May 29 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
node使用Koa2搭建web项目的方法
Oct 17 Javascript
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
微信小程序 image组件遇到的问题
May 28 Javascript
vue中使用[provide/inject]实现页面reload的方法
Sep 30 Javascript
JavaScript对象数组排序实例方法浅析
Jun 15 #Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
Jun 15 #Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
Jun 15 #Javascript
jQuery动态加载css文件实现方法
Jun 15 #Javascript
异步加载JS、CSS代码(推荐)
Jun 15 #Javascript
全面解析Javascript无限添加QQ好友原理
Jun 15 #Javascript
漫谈JS引擎的运行机制 你应该知道什么
Jun 15 #Javascript
You might like
php木马攻击防御之道
2008/03/24 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
Laravel框架Eloquent ORM删除数据操作示例
2019/12/03 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
管理学院毕业生自荐信范文
2014/03/10 职场文书
2014年高考决心书
2014/03/11 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
2015入党个人自传范文
2015/06/26 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书
Oracle笔记
2021/04/05 Oracle
java项目构建Gradle的使用教程
2022/03/24 Java/Android
Win11开始菜单添加休眠选项
2022/04/19 数码科技