5. 映射元素
集合映射是非常实用的工具。jQuery 定义了 each()和map()两个映射方法。each()方法是对集合中每个元素都执行回调函数,而 map()方法还能够收集每个回调函数的返回结果组成一个新的集合。
对于each()方法来说,jQuery实现代码如下所示。
广州网站建设,网站建设,广州网页设计,广州网站设计
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- }
然后通过调用jQuery.each()公共函数来实现元素的迭代操作。
- //对object中的每个对象都执行callback函数
- //参数args仅仅在内部使用
- each: function( object, callback, args ) {
- var name, i = 0, length = object.length;
- if ( args ) {
- if ( length === undefined ) {
- for ( name in object )
- if ( callback.apply( object[ name ], args ) === false )
- break;
- } else
- for ( ; i < length; )
- if ( callback.apply( object[ i++ ], args ) === false )
- break;
- //不是类数组的object,对每个属性都进行callback函数的调用
- } else {
- if ( length === undefined ) {
- for ( name in object )
- if ( callback.call( object[ name ], name, object[ name ] ) === false )
- break;
- } else
- for ( var value = object[0]; i < length && callback.call ( value, i, value ) !== false; value = object[++i] ){}
- }
- return object;
- }
这个公共函数支持第一个参数的类数组(数组)或对象。如果是数组就对每个元素进行callback操作;如果是对象,就对每个属性值进行callback操作。
callback回调函数的语法格式如下。
广州网站建设,网站建设,广州网页设计,广州网站设计
- callback:function(index,value)
参数index表示索引号,参数value表示数组中index对应的元素或对象的第index个处理的属性。如果使用参数args,则callback回调函数的语法格式如下。
- callback:function(args)
参数args是给回调函数设定的参数。而对于jQuery对象的each()方法,它的第二个参数args是采用传入的args直接给callback设定参数,而不是默认集合中index和对应的元素,但执行的次数还是集合的length次。
map()方法能够将一组元素转换成其他数组,它是通过回调函数返回值组成的数组。其实现代码如下。
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function(elem, i){
- return callback.call( elem, i, elem );
- }));
- },
map()方法将一组元素转换成其他数组,然后根据这个数组构建新的jQuery对象。在该方法中,通过jQuery.map(this, function(elem, i){}语句中this的jQuery对象集合的每个元素当作回调函数中elem的参数传到回调函数中。该回调函数又执行实例方法map()中的callback函数。jQuery.map()通过代理的回调来取得转换而成的元素集合,然后采用pushStack()方法把该集合的元素构建成新的jQuery对象并返回,同时保存原jQuery对象的引用。
map()公共函数的实现代码如下所示。
- map: function( elems, callback ) {
- var ret = [];
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- var value = callback( elems[ i ], i );
- if ( value != null )
- ret[ ret.length ] = value;
- }
- return ret.concat.apply( [], ret );
- }
上面的函数能够返回对elems中每个元素都进行callback函数操作后返回值的集合。



