深入浅析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 相关文章推荐
Jquery异步请求数据实例代码
Dec 28 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
Dec 12 Javascript
assert()函数用法总结(推荐)
Jan 25 Javascript
快速使用node.js进行web开发详解
Apr 26 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
利用JS动态生成隔行换色HTML表格的两种方法
Oct 09 Javascript
ES6 Class中实现私有属性的一些方法总结
Jul 08 Javascript
浅谈layui分页控件field参数接收对象的问题
Sep 20 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 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
IStream与TStream之间的相互转换
2008/08/01 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
简单学习Python time模块
2016/04/29 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
python中返回矩阵的行列方法
2018/04/04 Python
python实现按长宽比缩放图片
2018/06/07 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
什么是python类属性
2020/06/10 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
校运会入场式解说词
2014/02/10 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
拆迁委托协议书
2014/09/15 职场文书
2015年教师新年寄语
2014/12/08 职场文书
西柏坡观后感
2015/06/08 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android