underscore_1: map()
2024-09-01 18:23:58
map()是underscore.js中一个处理数组和对象的方法。
params:
1. array || obj
2. callback
3. content 上下文指向
使用:
var obj = {a:1, b: 2, c: 3}
var arr = [1.3,5,6,76]
_.map(arr, function(value, index, obj){
return value*3
});
这个代码如果我自己写的话当然很简单的想法了,就是判断传入参数类型,进行遍历,然后判断是否有回调,有的话,就执行,并将结果返回出去,没有的话,就将原值返回出去。
下面看下源码是怎样的吧。
调用过程:
map():
_.map = function (obj, iteratee, context) {
iteratee = cb(iteratee, context);
var keys = !isArray(obj) && Object.keys(obj);
var length = (keys || obj).length;
var result = Array(length);
for(var index = 0; index < length; index++) {
var current = keys ? keys[index] : index;
result[index] = iteartee(obj[current], index, obj);
}
} map方法在一开始调用了一个cb方法,对iteratee进行重写,下面看下cb
cb()
var defaultCb = function(value) {
return value;
}
/**
* argcount 在生成迭代的时候,对迭代器有几个参数的要求,默认3
* */
var cb = function(value, context, argcount) {
if (value == null ) return defaultCb;
if (isFunc(value)) return optimizeCb(value, context, argCount);
...
} 这里其实没什么好说的,如果没有回调,就给他一个默认方法。重点应该是在optimizeCb方法上。
optimizeCb()
var optimizeCb = function(func, context, argCount) {
if (context == void 0 ) return func;
switch (argCount == null ? 3 : argCount) {
case 1: return function(value) {
return func.call(context, value)
}
...
case 3: return function(value, index, object) {
return func.call(context, value, index, object);
}
}
} 在optimizeCb中,会注意到underscore使用了void 0 来代替undefined进行判断。
void是js的一个函数,但是,似乎很少用到,由于void的返回值是undefined,于是,被代替undefined以用来判断,毕竟,相比undefined,可以改写这一点,void更可靠一点
可以看到,在optimizeCb中使用了call函数,对func重新绑定了上下文,并返回。
其实在map方法中,主要的是iteratee设计(迭代设计),迭代可以基本大家都知道,但是却不十分了解。
迭代: 简单的说:就是通过某一种方法对数组,对象以及类数组中的每个元素进行处理。
而一个迭代器,至少有两个基础部分:
- 被迭代集合
- 当前迭代过程
而map中的迭代过程则是一个函数,就是传入的处理函数。至于cb函数,则是根据传参的不同情况创建迭代过程,为每次的迭代服务。
optimizeCb函数是对迭代函数的一个优化,基本上,map方法是通过迭代,对数据进行操作,从而返回一个新数组
最新文章
- PHP如何实现文件上传
- jquery iframe自适应高度[转]
- ssh 返回错误 Too many authentic authentication failures for root 的时候检查 ssh 配置
- GridView实现多表头合并[转]
- 为什么Laravel是最成功的PHP框架?
- cocos2d-x Lua与OC互相调用
- Android的BUG(四) - Android app的卡死问题
- nginx四层负载均衡配置
- 和为S的两个数
- synchronized和volatile简介
- Mysql原理与优化
- hy这个破项目
- C语言数据结构基础学习笔记——图
- Lodop删除语句Deleted只能内嵌设计维护可用
- 使用@RequestBody将请求体映射到Action方法参数中
- 游戏中转盘概率的算法---python实现
- poj3080(kmp+枚举)
- Delphi 10.3实现Android App的动态权限申请
- Successor hdu 4366 线段树
- Oracle简单的备份和恢复-导出和导入(2)
热门文章
- docker 搭建自己的仓库
- eclipse中解决/**/多行注释代码后,格式变乱的问题
- 第二阶段冲刺(个人)——six
- Kinect一代学习(一):开发环境搭建
- debian 9 安装远程桌面
- 洛谷 P2253 好一个一中腰鼓! 题解
- GitHub 上传文件过大报错:remote: error: GH001: Large files detected.
- ASP.Net Core使用分布式缓存Redis从入门到实战演练
- 《Linux就该这么学》培训笔记_ch18_使用MariaDB数据库管理系统
- (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题