jQueryソース分析(五)map関数$.mapと$fn.map関数の詳細

12628 ワード

$.map()関数は、指定した関数を使用して配列内の各要素(またはオブジェクトの各属性)を処理し、処理結果を新しい配列にカプセル化して返します.この関数には、次の3つのパラメータがあります.
Elems Array/objectタイプで指定した処理する配列またはオブジェクト.
callback遍歴実行コールバック関数
Argパラメータ、コールバック関数の実行時に入力されるパラメータ
callback関数の実行には、2つのパラメータを持つことができます.それぞれは、遍歴に対応する値とそのインデックス(オブジェクトではキー名)であり、戻り値がある場合は、戻り値を1つの配列にまとめることができます.
$.fn.map()の戻り値はjQueryオブジェクトであり、$も呼び出す.map()が実装され、返された配列は最後にpushStackを呼び出してjQueryオブジェクトを作成しただけで、以下のようになります.
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Documenttitle>
    <script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js">script>
head>
<body>
    <p id="p1">  1p>
    <p id="p2">  2p>
    <h1 id="h1">  1h1>
    <h1 id="h2">  2h1>
    <script>
        var arr=[11,12,13,14]; 
        var a =$.map(arr,function(element,index){return index;});
        console.log(a);                         //  :Array [ 0, 1, 2, 3 ]

        var b =$.map([p1,p2,h1,h2],function(elem,i){
            console.log(elem,i)                 //    :

( ) 0、

1、

2、

3

return elem.parentNode; }) console.log(b) // :Array [ body, body, body, body ] var c = $('p').map(function(i,elem){return elem.parentNode}); console.log(c.length) // :2 console.log(c[0]===c[1]) // :true console.log(c[1]===document.body) // :true script> body> html>

 
ソース分析
writer by:大砂漠QQ:2969969
および$.each()と同じ,$.map()も$.extend()を$にマウントします.fn上の、以下の通りです.
  map: function( elems, callback, arg ) {       //
    var value, key, ret = [],                           //ret       
      i = 0,
      length = elems.length,
      // jquery objects are treated as arrays
      isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;      //isArray    elems     

    // Go through the array, translating each of the items to their
    if ( isArray ) {                                    //          ,   for       ,
      for ( ; i < length; i++ ) {
        value = callback( elems[ i ], i, arg );           //  callback  ,       Object,  Object    arg

        if ( value != null ) {                            //            null  undefined,          ret。
          ret[ ret.length ] = value;
        }
      }

    // Go through every key on the object,
    } else {                                            //    ,   for-in     
      for ( key in elems ) {
        value = callback( elems[ key ], key, arg );

        if ( value != null ) {
          ret[ ret.length ] = value;
        }
      }
    }

    // Flatten any nested arrays
    return ret.concat.apply( [], ret );               //    concat() ret       ,   
  },

$についてfn.map()は$を呼び出す.mapは、以下のように実現される.
  map: function( callback ) {
    return this.pushStack( jQuery.map(this, function( elem, i ) {     //        jQuery.map()     .pushStack()  ,
      return callback.call( elem, i, elem );
    }));
  },

pushStackでは、以前に説明したように、新しいjQueryオブジェクトを作成するだけで、DOM要素とselectorプロパティを指定できます.