迭代是数值分析中通过从一个初始估计出发寻找一系列近似解来解决问题(一般是解方程或者方程组)的过程,为实现这一过程所使用的方法统称为迭代法(IterativeMethod)。
map()是underscore.js中一个处理数组和对象的方法。
params:
1.array||obj
2.callback
3.content上下文指向
使用:
varobj={a:1,b:2,c:3}
vararr=[1.3,5,6,76]
_.map(arr,function(value,index,obj){
returnvalue*3
});
这个代码如果我自己写的话当然很简单的想法了,就是判断传入参数类型,进行遍历,然后判断是否有回调,有的话,就执行,并将结果返回出去,没有的话,就将原值返回出去。
下面看下开发源码是怎样的吧。
调用过程:
map():
_.map=function(obj,iteratee,context){
iteratee=cb(iteratee,context);
varkeys=!isArray(obj)&&Object.keys(obj);
varlength=(keys||obj).length;
varresult=Array(length);
for(varindex=0;index varcurrent=keys?keys[index]:index; result[index]=iteartee(obj[current],index,obj); } } map方法在一开始调用了一个cb方法,对iteratee进行重写,下面看下cb cb() vardefaultCb=function(value){ returnvalue; } /** *argcount在生成迭代的时候,对迭代器有几个参数的要求,默认3 **/ varcb=function(value,context,argcount){ if(value==null)returndefaultCb; if(isFunc(value))returnoptimizeCb(value,context,argCount); ... } 这里其实没什么好说的,如果没有回调,就给他一个默认方法。重点应该是在optimizeCb方法上。 optimizeCb() varoptimizeCb=function(func,context,argCount){ if(context==void0)returnfunc; switch(argCount==null?3:argCount){ case1:returnfunction(value){ returnfunc.call(context,value) } ... case3:returnfunction(value,index,object){ returnfunc.call(context,value,index,object); } } } 在optimizeCb中,会注意到underscore使用了void0来代替undefined进行判断。 void是js的一个函数,但是,似乎很少用到,由于void的返回值是undefined,于是,被代替undefined以用来判断,毕竟,相比undefined,可以改写这一点,void更可靠一点 可以看到,在optimizeCb中使用了call函数,对func重新绑定了上下文,并返回。 其实在map方法中,主要的是iteratee设计(迭代设计),迭代可以基本大家都知道,但是却不十分了解。 迭代:简单的说:就是通过某一种方法对数组,对象以及类数组中的每个元素进行处理。 而一个迭代器,至少有两个基础部分: 被迭代集合 当前迭代过程 而map中的迭代过程则是一个函数,就是传入的处理函数。至于cb函数,则是根据传参的不同情况创建迭代过程,为每次的迭代服务。 optimizeCb函数是对迭代函数的一个优化,基本上,map方法是通过迭代,对数据进行操作,从而返回一个新数组。 最常见的迭代法是牛顿法。其他还包括最速下降法、共轭迭代法、变尺度迭代法、最小二乘法、线性规划、非线性规划、单纯型法、惩罚函数法、斜率投影法、遗传算法、模拟退火等等。
¥39.00
¥59.00
¥99.00