深入浅析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 相关文章推荐
js常用函数 不错
Sep 08 Javascript
jQuery基础知识filter()和find()实例说明
Jul 06 Javascript
判断输入是否为空,获得输入类型的JS代码
Oct 30 Javascript
php析构函数的具体用法小结
Mar 11 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
Oct 30 Javascript
jquery果冻抖动效果实现方法
Jan 15 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
May 17 Javascript
原生js获取元素样式的简单方法
Aug 06 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
Dec 22 Javascript
JS内部事件机制之单线程原理
Jul 02 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 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 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
python人人网登录应用实例
2014/09/26 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python 链接和操作 memcache方法
2017/03/04 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Python装饰器简单用法实例小结
2018/12/03 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
python实现画出e指数函数的图像
2019/11/21 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
X/HTML5 和 XHTML2
2008/10/17 HTML / CSS
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
财务主管自我鉴定
2014/01/17 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
初中生活随笔
2015/08/15 职场文书
MSSQL基本语法操作
2022/04/11 SQL Server