亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jquery.map()方法的使用詳解

2019-11-20 12:04:32
字體:
來源:轉載
供稿:網友

原型方法map跟each類似調用的是同名靜態方法,只不過返回來的數據必須經過另一個原型方法pushStack方法處理之后才返回,源碼如下:

map: function( callback ) {    return this.pushStack( jQuery.map(this, function( elem, i ) {      return callback.call( elem, i, elem );    }));  },

本文主要就是分析靜態map方法至于pushStack在下一篇隨筆里面分析;

首先了解下map的使用(手冊內容)

$.map將一個數組中的元素轉換到另一個數組中。

作為參數的轉換函數會為每個數組元素調用,而且會給這個轉換函數傳遞一個表示被轉換的元素作為參數。

轉換函數可以返回轉換后的值、null(刪除數組中的項目)或一個包含值的數組,并擴展至原始數組中。

參數
arrayOrObject,callbackArray/Object,FunctionV1.6
arrayOrObject:數組或者對象。

為每個數組元素調用,而且會給這個轉換函數傳遞一個表示被轉換的元素作為參數。

函數可返回任何值。

另外,此函數可設置為一個字符串,當設置為字符串時,將視為“lambda-form”(縮寫形式?),其中 a 代表數組元素。

如“a * a”代表“function(a){ return a * a; }”。

示例1:

//將原數組中每個元素加 4 轉換為一個新數組。//jQuery 代碼:$.map( [0,1,2], function(n){ return n + 4;});//結果:[4, 5, 6]

示例2:

//原數組中大于 0 的元素加 1 ,否則刪除。//jQuery 代碼:$.map( [0,1,2], function(n){ return n > 0 ? n + 1 : null;});//結果:[2, 3]

示例3:

//原數組中每個元素擴展為一個包含其本身和其值加 1 的數組,并轉換為一個新數組//jQuery 代碼:$.map( [0,1,2], function(n){ return [ n, n + 1 ];});//結果:[0, 1, 1, 2, 2, 3]

可以看出map方法跟each方法類似通過循環每個對象或者數組的“項”執行回調函數來實現對數組或者對象的操作,但是這兩個方法也有很多不同點

比如each()返回的是原來的數組,并不會新創建一個數組,而map則會創建新的數組,;each遍歷是this指向當前數組或對象值,map則指向window,因為在源碼中并不像each那樣使用對象冒充;

例如:

var items = [1,2,3,4]; $.each(items, function() { alert('this is ' + this); }); var newItems = $.map(items, function(i) { return i + 1; }); // newItems is [2,3,4,5]//使用each時,改變的還是原來的items數組,而使用map時,不改變items,只是新建一個新的數組。var items = [0,1,2,3,4,5,6,7,8,9]; var itemsLessThanEqualFive = $.map(items, function(i) { // removes all items > 5 if (i > 5)   return null;   return i; }); // itemsLessThanEqualFive = [0,1,2,3,4,5]

言歸正傳回到map源碼

// arg is for internal usage only  map: function( elems, callback, arg ) {    var value, key, 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 ) ) ;    // Go through the array, translating each of the items to their    if ( isArray ) {      for ( ; i < length; i++ ) {        value = callback( elems[ i ], i, arg );        if ( value != null ) {          ret[ ret.length ] = value;        }      }    // Go through every key on the object,    } else {      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 );  },

首先還是聲明幾個變量為接下來的遍歷做準備,其中jsArray變量用來簡單區分對象和數組,這個布爾復合表達式比較長不過只要記住js運算符的有優先順序就不難理解了,首先括號優先執行然后就是邏輯與》邏輯或》全等》賦值,然后就可以分析啦

首先圓括號里先計算然后結果加上 length !== undefined 、 typeof length === "number這兩個必要條件最后的結果再跟elems instanceof jQuery進行邏輯或的運算,簡單的說就是isArray為真的情況有:

1、elems instanceof jQuery  為true 換言之就是jquery對象

2、length !== undefined && typeof length === "number" 和  length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems )這三個至少成立一個

可以拆分為3個小情況

length是存在并且是數字而且待遍歷的數組或者類數組等length屬性大于0 length-1存在  這樣就保證了是能遍歷的,比如對于jquery對象  domList對象等

length是存在并且是數字而且length屬性等于0  如果是0也沒關系就是不會遍歷

length是存在并且是數字而且待遍歷對象是純數組

滿足這些條件之后開始根據isArray的結果分開遍歷,對于“數組”采用for循環,對于對象采用for...in循環

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

是數組或者類數組的時候直接把循環的每一項的值和指針以及arg參數傳入回調函數中執行,arg參數是此方法內部使用的參數,跟each以及一些其他jquery方法很相似,只要在執行回調函數時不返回null就把執行返回的結果添加到新數組中,對象操作亦是如此直接略過

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

最后將結果集扁平化,為什么有這一步呢?因為map是可以擴展數組的在前面第3個示例就是如此:

$.map( [0,1,2], function(n){ return [ n, n + 1 ];});

如果是這樣使用的話得到的新數組是一個二維數組,所以必須降維

 ret.concat.apply( [], ret )等價于[].concat.apply([],ret)關鍵作用的是apply,因為apply的第二個參數把ret的數組分成多個參數傳入給concat把二維數組轉化為一維數組這個用法還是值得收藏的的

map方法簡單分析完畢,能力有限錯誤之處望多多指正。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美视频在线观看 亚洲欧| 亚洲色图欧美制服丝袜另类第一页| 亚洲三级黄色在线观看| 欧美成人一区在线| 国产视频精品在线| 日韩精品视频三区| 亚洲免费av网址| 久久资源免费视频| 555www成人网| 欧美日韩国产中文字幕| 日韩精品免费在线视频| 欧美视频在线免费| 中文字幕日韩精品在线观看| 亚洲精品美女免费| 欧美性猛交xxxx乱大交蜜桃| 久久精品小视频| 性欧美亚洲xxxx乳在线观看| 4438全国亚洲精品在线观看视频| 欧美一级在线播放| 深夜福利日韩在线看| 国产亚洲综合久久| 伊人久久综合97精品| 亚洲第一区第一页| 日韩成人激情影院| 亚洲电影第1页| 国产成人久久久| 精品久久久久久电影| 国产一区二区三区四区福利| 日本欧美一二三区| 亚洲一区二区三区四区在线播放| 午夜精品一区二区三区av| 高清一区二区三区日本久| 国产亚洲欧洲在线| 国产精品自产拍高潮在线观看| 久久久国产精品免费| 久久久久久亚洲| 国产精品一区二区三区毛片淫片| 色噜噜狠狠狠综合曰曰曰| 亚洲男人天堂手机在线| 久久999免费视频| 精品日韩中文字幕| 在线丨暗呦小u女国产精品| 亚洲女在线观看| 亚洲第一av网站| 国产精品影片在线观看| 国产精品中文字幕在线观看| 亚洲国产欧美一区二区三区久久| 美女av一区二区三区| 亚洲精品国产精品自产a区红杏吧| 国产精品久久久久久av| 国外日韩电影在线观看| 亚洲人成人99网站| 日日摸夜夜添一区| 91精品在线播放| 夜夜嗨av一区二区三区四区| 欧美日韩精品在线| 在线观看欧美日韩| 国产97色在线| 国产主播精品在线| 久久视频免费在线播放| 麻豆成人在线看| 国产精品pans私拍| 啪一啪鲁一鲁2019在线视频| 亚洲第一网中文字幕| 久久久精品在线| 日本一区二区在线播放| 久久久免费观看视频| 久久综合伊人77777蜜臀| 欧美一区二区三区……| 日韩成人在线电影网| 国产成人中文字幕| 亚洲精品videossex少妇| 国产日韩欧美91| 亚洲奶大毛多的老太婆| 97免费视频在线| 久久成人综合视频| 国产精品永久免费| 一区二区欧美在线| 久久中文字幕视频| 中文字幕久久久av一区| 性欧美xxxx| 国产精品入口夜色视频大尺度| 亚洲国产一区自拍| 热久久视久久精品18亚洲精品| 亚洲午夜性刺激影院| 国产精品男女猛烈高潮激情| 国产午夜精品理论片a级探花| 欧美丝袜美女中出在线| 91tv亚洲精品香蕉国产一区7ujn| 国产精品999999| 国产日韩在线亚洲字幕中文| 国内精品久久久久久久久| 精品少妇v888av| 亚洲国内精品在线| 亚洲影视中文字幕| 中文字幕一区二区精品| 中文字幕亚洲综合久久| 日本久久久久久久| 97视频网站入口| 91精品国产电影| 国产精品视频免费在线观看| 国产视频福利一区| 午夜精品理论片| 亚洲欧美激情四射在线日| 精品成人69xx.xyz| 这里只有精品视频在线| 欧美精品亚州精品| 亚洲人午夜精品免费| 久久精品一本久久99精品| 欧美性猛交视频| 九九热这里只有精品6| 91av免费观看91av精品在线| 久久久成人的性感天堂| 国产精品私拍pans大尺度在线| 国产精品久久77777| 亚洲精品国产精品乱码不99按摩| 亚洲福利精品在线| 日韩中文在线视频| 欧美整片在线观看| 91精品国产色综合久久不卡98口| 日韩精品中文字幕久久臀| 欧美一级淫片aaaaaaa视频| 色香阁99久久精品久久久| 国产午夜精品全部视频在线播放| 亚洲国产精品字幕| 欧美日韩一区二区三区在线免费观看| 国产一区二区在线免费视频| 91久久久久久久久久久久久| 国产成人精品一区二区| 日韩成人中文字幕| 91精品久久久久久久久久久久久久| 国产精品成人在线| 精品日本美女福利在线观看| 91社区国产高清| 国产97在线亚洲| 日本一区二区三区在线播放| 欧美激情精品久久久| 国产精品网站视频| 菠萝蜜影院一区二区免费| 欧美日本黄视频| 中文在线资源观看视频网站免费不卡| 国产日韩亚洲欧美| 国产一区二区三区在线免费观看| 日韩电影在线观看免费| 91理论片午午论夜理片久久| 成人国产精品一区二区| 亚洲国产一区二区三区在线观看| 久久成人精品视频| 亚洲激情国产精品| 亚洲伊人久久大香线蕉av| 欧美综合国产精品久久丁香| 日韩av在线天堂网| 午夜精品www| 精品网站999www| 黄色成人av在线| 久久精品国产一区| 国产一区二区日韩| 国产性色av一区二区| 欧美丝袜一区二区| 成人激情黄色网| 国产欧美一区二区三区视频| 欧美日韩电影在线观看| 高清欧美性猛交| 青青精品视频播放|