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; };