五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > JS/javascript中的forEach、$.each、map使用方法

JS/javascript中的forEach、$.each、map使用方法

文章來源:365jz.com     點擊數(shù):590    更新時間:2017-12-14 19:45   參與評論

forEach是ECMA5中Array新方法中最基本的一個,就是遍歷,循環(huán)。例如下面這個例子:

[1, 2 ,3, 4].forEach(alert);

等同于下面這個for循環(huán)

var array = [1, 2, 3, 4];
for (var k = 0, length = array.length; k < length; k++) {
 alert(array[k]);
}

Array在ES5新增的方法中,參數(shù)都是function類型,默認(rèn)有傳參,forEach方法中的function回調(diào)支持3個參數(shù),第1個是遍歷的數(shù)組內(nèi)容;第2個是對應(yīng)的數(shù)組索引,第3個是數(shù)組本身。

因此,我們有:

[].forEach(function(value, index, array) {
  // ...
});

對比jQuery中的$.each方法:

$.each([], function(index, value, array) {
  // ...
});

會發(fā)現(xiàn),第1個和第2個參數(shù)正好是相反的,大家要注意了,不要記錯了。后面類似的方法,例如$.map也是如此。

var data=[1,3,4] ; 
var sum=0 ;
data.forEach(function(val,index,arr){
  console.log(arr[index]==val);  // ==> true
  sum+=val            
})
console.log(sum);          // ==> 8

map

這里的map不是“地圖”的意思,而是指“映射”。[].map(); 基本用法跟forEach方法類似:

array.map(callback,[ thisObject]);

callback的參數(shù)也類似:

[].map(function(value, index, array) {
  // ...
});

map方法的作用不難理解,“映射”嘛,也就是原數(shù)組被“映射”成對應(yīng)新數(shù)組。下面這個例子是數(shù)值項求平方:

var data=[1,3,4]

var Squares=data.map(function(val,index,arr){
  console.log(arr[index]==val);  // ==> true
  return val*val           
})
console.log(Squares);        // ==> [1, 9, 16]

注意:由于forEach、map都是ECMA5新增數(shù)組的方法,所以ie9以下的瀏覽器還不支持(萬惡的IE啊),不過呢,可以從Array原型擴(kuò)展可以實現(xiàn)以上全部功能,例如forEach方法:

if (typeof Array.prototype.forEach != "function") {
  Array.prototype.forEach = function() {
    /* 實現(xiàn) */
  };
}

 

forEach是ES5中操作數(shù)組的一種方法,主要功能是遍歷數(shù)組,例如:

 

var arr = [1,2,3,4];
arr.forEach(alert);

等價于:

var arr = [1, 2, 3, 4];
for (var k = 0, length = arr.length; k < length; k++) {
alert(array[k]);
}

forEach方法中的function回調(diào)有三個參數(shù):第一個參數(shù)是遍歷的數(shù)組內(nèi)容,第二個參數(shù)是對應(yīng)的數(shù)組索引,第三個參數(shù)是數(shù)組本身

因此:

  [].forEach(function(value,index,array){


    //code something

  });

等價于:

 $.each([],function(index,value,array){


   //code something

 })

寫一個例子;

var arr = [1,2,3,4];
arr.forEach(function(value,index,array){
    array[index] == value;    //結(jié)果為true
    sum+=value; 
    });
console.log(sum);    //結(jié)果為 10

 

map:map即是 “映射”的意思 用法與 forEach 相似,用法即:

[].map(function(value,index,array){

  //code

})


一、原生JS forEach()和map()遍歷

共同點:

    1.都是循環(huán)遍歷數(shù)組中的每一項。

    2.forEach() 和 map() 里面每一次執(zhí)行匿名函數(shù)都支持3個參數(shù):數(shù)組中的當(dāng)前項item,當(dāng)前項的索引index,原始數(shù)組input。

    3.匿名函數(shù)中的this都是指Window。

    4.只能遍歷數(shù)組。

1.forEach()

   沒有返回值。

arr[].forEach(function(value,index,array){

  //do something

})

參數(shù):value數(shù)組中的當(dāng)前項, index當(dāng)前項的索引, array原始數(shù)組;
數(shù)組中有幾項,那么傳遞進(jìn)去的匿名回調(diào)函數(shù)就需要執(zhí)行幾次;
理論上這個方法是沒有返回值的,僅僅是遍歷數(shù)組中的每一項,不對原來數(shù)組進(jìn)行修改;但是可以自己通過數(shù)組的索引來修改原來的數(shù)組;

var ary = [12,23,24,42,1]; 
var res = ary.forEach(function (item,index,input) { 
       input[index] = item*10; 
}) 
console.log(res);//--> undefined; 
console.log(ary);//--> 通過數(shù)組索引改變了原數(shù)組; 


2.map()

有返回值,可以return 出來。

arr[].map(function(value,index,array){

  //do something

  return XXX

})

參數(shù):value數(shù)組中的當(dāng)前項,index當(dāng)前項的索引,array原始數(shù)組;
區(qū)別:map的回調(diào)函數(shù)中支持return返回值;return的是啥,相當(dāng)于把數(shù)組中的這一項變?yōu)樯叮ú⒉挥绊懺瓉淼臄?shù)組,只是相當(dāng)于把原數(shù)組克隆一份,把克隆的這一份的數(shù)組中的對應(yīng)項改變了);

var ary = [12,23,24,42,1]; 
var res = ary.map(function (item,index,input) { 
    return item*10; 
}) 
console.log(res);//-->[120,230,240,420,10];  原數(shù)組拷貝了一份,并進(jìn)行了修改
console.log(ary);//-->[12,23,24,42,1];  原數(shù)組并未發(fā)生變化

兼容寫法:



不管是forEach還是map在IE6-8下都不兼容(不兼容的情況下在Array.prototype上沒有這兩個方法),那么需要我們自己封裝一個都兼容的方法,代碼如下:

/**
* forEach遍歷數(shù)組
* @param callback [function] 回調(diào)函數(shù);
* @param context [object] 上下文;
*/ 
Array.prototype.myForEach = function myForEach(callback,context){ 
    context = context || window; 
    if('forEach' in Array.prototye) { 
        this.forEach(callback,context); 
        return; 
    } 
    //IE6-8下自己編寫回調(diào)函數(shù)執(zhí)行的邏輯 
    for(var i = 0,len = this.length; i < len;i++) { 
        callback && callback.call(context,this[i],i,this); 
    } 

 

/**
* map遍歷數(shù)組
* @param callback [function] 回調(diào)函數(shù);
* @param context [object] 上下文;
*/ 
Array.prototype.myMap = function myMap(callback,context){ 
    context = context || window; 
    if('map' in Array.prototye) { 
        return this.map(callback,context); 
    } 
    //IE6-8下自己編寫回調(diào)函數(shù)執(zhí)行的邏輯 
    var newAry = []; 
    for(var i = 0,len = this.length; i < len;i++) { 
        if(typeof  callback === 'function') { 
            var val = callback.call(context,this[i],i,this); 
            newAry[newAry.length] = val; 
        } 
    } 
    return newAry; 



二、jQuery $.each()和$.map()遍歷

共同點:

即可遍歷數(shù)組,又可遍歷對象。



1.$.each()

沒有返回值。$.each()里面的匿名函數(shù)支持2個參數(shù):當(dāng)前項的索引i,數(shù)組中的當(dāng)前項v。如果遍歷的是對象,k 是鍵,v 是值。

$.each(arr, function(index,value){

  //do something

})

參數(shù):arr要遍歷的數(shù)組,index當(dāng)前項的索引,value數(shù)組中的當(dāng)前項
第1個和第2個參數(shù)正好和以上兩個函數(shù)是相反的,注意不要記錯了

$.each( ["a","b","c"], function(i, v){ 
     alert( i + ": " + v ); 
}); 
[javascript] view plain copy

$("span").each(function(i, v){ 
     alert( i + ": " + v ); 
}); 

 

$.each( { name: "John", lang: "JS" }, function(k, v){ 
     alert( "Name: " + k + ", Value: " + v ); 
}); 



2.$.map()

有返回值,可以return 出來。$.map()里面的匿名函數(shù)支持2個參數(shù)和$.each()里的參數(shù)位置相反:數(shù)組中的當(dāng)前項v,當(dāng)前項的索引 i。如果遍歷的是對象,k 是鍵,v 是值。如果是$("span").map()形式,參數(shù)順序和$.each()  $("span").each()一樣。

$.map(arr, function(value, index){

  //do something

  return XXX

})

 

var arr=$.map( [0,1,2], function(v){ 
     return v + 4; 
}); 
console.log(arr); 

 

$.map({"name":"Jim","age":17},function(k, v){ 
     console.log( k+":"+v ); 
}); 

 


如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會為你解答?。?點擊進(jìn)入論壇

發(fā)表評論 (590人查看0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號