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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:23:00
字體:
來源:轉載
供稿:網友

本文給大家詳細介紹了jQuery中的原型方法map的使用指南和源碼分析,十分的不錯,對于大家學習jQuery非常有幫助,這里推薦給大家。

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

 

 
  1. map: function( callback ) { 
  2. return this.pushStack( jQuery.map(thisfunction( elem, i ) { 
  3. return callback.call( elem, i, elem ); 
  4. })); 
  5. }, 

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

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

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

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

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

參數

arrayOrObject,callbackArray/Object,FunctionV1.6

arrayOrObject:數組或者對象。

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

函數可返回任何值。

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

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

示例1:

 

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

示例2:

 

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

示例3:

 

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

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

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

例如:

 

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

言歸正傳回到map源碼

 

 
  1. // arg is for internal usage only 
  2. map: function( elems, callback, arg ) { 
  3. var value, key, ret = [], 
  4. i = 0, 
  5. length = elems.length, 
  6. // jquery objects are treated as arrays 
  7. isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; 
  8.  
  9. // Go through the array, translating each of the items to their 
  10. if ( isArray ) { 
  11. for ( ; i < length; i++ ) { 
  12. value = callback( elems[ i ], i, arg ); 
  13.  
  14. if ( value != null ) { 
  15. ret[ ret.length ] = value; 
  16.  
  17. // Go through every key on the object, 
  18. else { 
  19. for ( key in elems ) { 
  20. value = callback( elems[ key ], key, arg ); 
  21.  
  22. if ( value != null ) { 
  23. ret[ ret.length ] = value; 
  24.  
  25. // Flatten any nested arrays 
  26. return ret.concat.apply( [], ret ); 
  27. }, 

首先還是聲明幾個變量為接下來的遍歷做準備,其中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循環

 

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

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

 

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

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

 

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

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一色在线| 日韩中文在线不卡| 欧美怡春院一区二区三区| 欧美日韩国产一区中文午夜| 亚洲欧美精品suv| 久久精品亚洲94久久精品| 欧美性猛交xxxx免费看| 国产亚洲精品久久| 欧美日韩电影在线观看| 欧美激情乱人伦| 欧美大片欧美激情性色a∨久久| 亚洲精品www久久久久久广东| 日韩精品在线观| 免费成人高清视频| 国产视频久久久久久久| 亚洲精品国精品久久99热一| 久久久久久999| 欧美大片欧美激情性色a∨久久| 成人两性免费视频| 亚洲欧洲av一区二区| 欧美做受高潮1| 日韩av不卡在线| 久久综合久中文字幕青草| 色偷偷88888欧美精品久久久| 国产视频精品久久久| 欧美午夜宅男影院在线观看| 精品久久久久久国产| 国产精品夜间视频香蕉| 在线激情影院一区| 欧美一级淫片videoshd| 亚洲第一福利在线观看| 国产福利视频一区| 色婷婷亚洲mv天堂mv在影片| 精品成人国产在线观看男人呻吟| 一区二区三区视频在线| 最好看的2019年中文视频| 91国语精品自产拍在线观看性色| 中文字幕亚洲专区| 国产999精品久久久影片官网| 欧美成人免费全部| 成人黄色网免费| 久久免费少妇高潮久久精品99| 亚洲男女自偷自拍图片另类| 欧美精品激情blacked18| 久久欧美在线电影| 日韩在线观看免费高清| 日本精品久久久| 国产精品99久久久久久www| 欧美精品videosex极品1| 亚洲码在线观看| 日本韩国在线不卡| 91精品国产色综合久久不卡98口| 亚洲国产中文字幕在线观看| 国产精品久久久久免费a∨大胸| 亚洲乱码一区二区| 国产精品专区一| 日韩精品极品视频| 久久夜色精品国产欧美乱| 国产精品精品久久久| 狠狠色狠狠色综合日日小说| 成人性教育视频在线观看| 欧美最猛性xxxxx亚洲精品| 精品国产欧美一区二区三区成人| 国产精品777| 国产精品日韩在线| 日韩欧美国产免费播放| 成人精品在线观看| 久久亚洲精品一区| 国产精品丝袜视频| 俺去亚洲欧洲欧美日韩| 5278欧美一区二区三区| 国产精品久久久久久搜索| 久久全球大尺度高清视频| 国产精品久久电影观看| 国产精品视频地址| 精品偷拍各种wc美女嘘嘘| 美女久久久久久久久久久| 国产精品亚洲综合天堂夜夜| 国产成人精品电影久久久| 久久影院免费观看| 国产精品第一区| 久久久久这里只有精品| 亚洲人成在线免费观看| 日韩欧美亚洲国产一区| 国产视频在线观看一区二区| 色综合91久久精品中文字幕| 欧美亚洲在线视频| 亚洲一区中文字幕在线观看| 国产成人高清激情视频在线观看| 久久精品国产2020观看福利| 九九热精品在线| 日本精品久久中文字幕佐佐木| 一本一道久久a久久精品逆3p| 日韩视频在线一区| 欧美精品xxx| 不卡在线观看电视剧完整版| 久久久国产91| www亚洲精品| 91精品中国老女人| 欧美伦理91i| 欧美一级淫片丝袜脚交| 一区二区在线视频播放| 88国产精品欧美一区二区三区| 亚洲国产日韩欧美在线99| 成人做爰www免费看视频网站| 久久国产精品免费视频| 国产精自产拍久久久久久| 日本久久久久久久| 中文字幕最新精品| 亚洲久久久久久久久久| 国产69精品久久久久久| 亚洲精品一区久久久久久| 91国产在线精品| 5566成人精品视频免费| 最新69国产成人精品视频免费| 国产美女扒开尿口久久久| 国产欧美亚洲精品| 久久精品人人做人人爽| 欧美丝袜美女中出在线| 欧美激情乱人伦一区| 国模精品系列视频| 超薄丝袜一区二区| 亚洲va欧美va国产综合剧情| 久久国产精品久久国产精品| 中文字幕一精品亚洲无线一区| 午夜精品久久久久久久男人的天堂| 97视频在线看| 中文字幕不卡在线视频极品| 日韩av电影手机在线| 欧美福利视频在线观看| 国产精品免费福利| 欧美日韩国产精品| 黄色一区二区在线| 欧美专区在线观看| 色99之美女主播在线视频| 欧美日韩在线另类| 性色av一区二区三区免费| 欧美日韩国产精品一区二区不卡中文| 亚洲国产婷婷香蕉久久久久久| 秋霞午夜一区二区| 在线视频亚洲欧美| 色噜噜亚洲精品中文字幕| 久久视频在线播放| 久久精品99国产精品酒店日本| 精品色蜜蜜精品视频在线观看| 久久久视频在线| 色噜噜久久综合伊人一本| 爱福利视频一区| 国产精品成久久久久三级| 夜夜嗨av色综合久久久综合网| 在线观看亚洲视频| 国产成人a亚洲精品| 51久久精品夜色国产麻豆| 欧美一区二粉嫩精品国产一线天| 国产精品色婷婷视频| 亚洲国产精品福利| 中文字幕日韩精品在线观看| 色噜噜亚洲精品中文字幕| 91精品国产色综合久久不卡98口| 中文字幕亚洲精品| 亚洲国产精品免费| 青草青草久热精品视频在线网站| 日韩美女av在线免费观看| 中文字幕亚洲欧美日韩在线不卡|