深入浅析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 相关文章推荐
Javascript 错误处理的几种方法
Jun 13 Javascript
jquery ajax同步异步的执行最终解决方案
Apr 26 Javascript
js猜数字小游戏的简单实现代码
Jul 02 Javascript
jquery mobile changepage的三种传参方法介绍
Sep 13 Javascript
jQuery插件pagination实现分页特效
Apr 12 Javascript
浅谈jquery中delegate()与live()
Jun 22 Javascript
Angular 2.x学习教程之结构指令详解
May 25 Javascript
vue 设置proxyTable参数进行代理跨域
Apr 09 Javascript
区分vue-router的hash和history模式
Oct 03 Javascript
微信小程序实现选项卡滑动切换
Oct 22 Javascript
ES6 解构赋值的原理及运用
May 25 Javascript
Vue如何清空对象
Mar 03 Vue.js
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实现小型站点广告管理(修正版)
2006/10/09 PHP
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
Linux中为php配置伪静态
2014/12/17 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
python数据结构之链表详解
2017/09/12 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
python中os包的用法
2020/06/01 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
经济管理专业自荐信
2013/12/30 职场文书
家具促销活动方案
2014/02/16 职场文书
演讲主持词
2014/03/18 职场文书
战略合作协议书范本
2014/04/18 职场文书
干部鉴定材料
2014/05/18 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
金陵十三钗观后感
2015/06/04 职场文书