jQuery源码浅谈系列---$.map
其实这个api的实现原理上会很类似我以前写的$.each的一些思想。如果你弄懂了前面这个,我想再来看看$.map可能就很容易理解了
-------------功能上针对的是Array,将一个Array的元素转换到另一个数组中
ps:昨天和光哥探讨一些技术的时候忽然光哥问我 你觉得map到底是什么? thinking...............
先上源码:
/*
@param elems是传过来的array对象
@param callback是传过来的回调处理函数
@args 是jQuery内部使用时候传的一个标志,比如remove这些api
@return ret-----新的数组
@remark 源码做了一些写法上的小改动 比如早定义length 个人习惯吧
*/
map: function(elems,callback,args){
var ret = [],
value,
i
length = elems.length;
//根据length进行数组对象的遍历
for(i=0;i<length;i++){
//callback进行回调--函数调用模式,this被绑定到全局对象
value = callback(elems[i],i,arg);
//回调的值与null进行比较再往ret中装
if(value != null){
//这样的写法也是一种优化,比push这个好,个人比较推荐
ret[ret.length] = value;
}
}
}
下面继续贴上我整理的凤凰lib里面的array.map
/*
*map-traverse the array with the func into an new array*
*@param {Array} source---the array*
*@param {Function} iterator---the func*
*@param {Object} thisObj*
*@remark(if thisObj is not defined,default the source)*
*@return {Array} results----after map*
*/
ZYC.array.map = function(source,iterator,thisObj){
var results = [],
i=0,
_length =source.length;
for(;i<_length;i++){
//这边我的函数调用方式是call,支持了第3个参数thisObj
//如果thisObj没有定义的话就直接拿source
//思想参照了tangram
//没有对返回值进行null的判断直接装
results[i] = iterator.call(thisObj ||source, source[i],i);
}
return results;
};
511

被折叠的 条评论
为什么被折叠?



