Array迭代方法map

What is the result of this expression? (or multiple ones) 
["1", "2", "3"].map(parseInt) 
A:["1", "2", "3"]
B:[1, 2, 3]
C:[0, 1, 2]
D:other

 

概述:

map方法 返回 一個由原數組中每一個元素 調用一個指定方法後的返回值 組成的新數組.javascript

語法:

array.map(callback[, thisArg])java

參數:

callback原數組中的元素通過該方法後返回一個新的元素.
thisArg執行callback函數時this指向的對象.git

描述:

map 方法會給原數組中的每一個元素(必須有值)都調用一次 callback 函數.callback 每次執行後的返回值組合起來造成一個新數組.
callback函數只會在有值的索引上被調用; 那些歷來沒被賦過值或者使用delete刪除的索引則不會被調用.
callback 函數會被自動傳入三個參數: 數組元素, 元素索引,原數組自己.
若是thisArg參數有值,則每次callback函數被調用的時候,this都會指向thisArg參數上的這個對象.若是省略了thisArg參數,或者賦值爲null, 則this指向全局對象window.
map不修改調用它的原數組自己.github

兼容性:

map 是在最近的ECMA-262 標準中新添加的方法;因此一些舊版本的瀏覽器可能沒有實現該方法.
在那些沒有原生支持map 方法的瀏覽器中.你可使用下面的javascript代碼來實現它.所使用的算法正是 ECMA-262,第5版規定的.
假定Object, TypeError, 和 Array 有他們的原始值.並且callback.call的原始值也是 Function.prototype.call算法

// 實現 ECMA-262, Edition 5, 15.4.4.19
// 參考: http://es5.github.com/#x15.4.4.19
if (!Array.prototype.map) {
Array.prototype.map = function(callback, thisArg) {

var T, A, k;

if (this == null) {
throw new TypeError(" this is null or not defined");
}

// 1. 將O賦值爲調用map方法的數組.
var O = Object(this);

// 2.將len賦值爲數組O的長度.
var len = O.length >>> 0;

// 4.若是callback不是函數,則拋出TypeError異常.
if ({}.toString.call(callback) != "[object Function]") {
throw new TypeError(callback + " is not a function");
}

// 5. 若是參數thisArg有值,則將T賦值爲thisArg;不然T爲undefined.
if (thisArg) {
T = thisArg;
}

// 6. 建立新數組A,長度爲原數組O長度len
A = new Array(len);

// 7. 將k賦值爲0
k = 0;

// 8. 當 k < len 時,執行循環.
while(k < len) {

var kValue, mappedValue;

//遍歷O,k爲原數組索引
if (k in O) {

//kValue爲索引k對應的值.
kValue = O[ k ];

// 執行callback,this指向T,參數有三個.分別是kValue:值,k:索引,O:原數組.
mappedValue = callback.call(T, kValue, k, O);

// 返回值添加到新書組A中.
A[ k ] = mappedValue;
}
// k自增1
k++;
}

// 9. 返回新數組A
return A;
}; 
}
例子
Example: 將數組中的單詞轉換成對應的複數形式.

下面的代碼將一個數組中的全部單詞轉換成對應的複數形式.
function fuzzyPlural(single) {
var result = single.replace(/o/g, 'e'); 
if( single === 'kangaroo'){
result += 'se';
}
return result; 
}

var words = ["foot", "goose", "moose", "kangaroo"];
console.log(words.map(fuzzyPlural));

// ["feet", "geese", "meese", "kangareese"]

 

Example: 求數組中每一個元素的平方根.express

下面的代碼建立了一個新數組,值爲原數組中對應數字的平方根.數組

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
/* roots的值爲[1, 2, 3], numbers的值仍爲[1, 4, 9] */

 

Example: 在字符串上使用map方法瀏覽器

下面的例子演示如在在一個 string 上使用map方法,獲取字符串中每一個字符所對應的ascii碼組成的數組:app

var map = Array.prototype.map
var a = map.call("Hello World", function(x) { return x.charCodeAt(0); })
// a的值爲[72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]

使用技巧案例
一般狀況下,map方法中的callback函數只須要接受一個參數,就是正在被遍歷的數組元素自己. 
但這並不意味着map只給callback傳了一個參數.這個思惟慣性可能會讓咱們犯一個很容易犯的錯誤.
// 下面的語句返回什麼呢:
["1", "2", "3"].map(parseInt);
// 你可能覺的會是[1, 2, 3]
// 但實際的結果是 [1, NaN, NaN]

// 一般使用parseInt時,只須要傳遞一個參數.但實際上,parseInt能夠有兩個參數.第二個參數是進制數.能夠經過語句"alert(parseInt.length)===2"來驗證.
// map方法在調用callback函數時,會給它傳遞三個參數:當前正在遍歷的元素, 元素索引, 原數組自己.
// 第三個參數parseInt會忽視, 但第二個參數不會,也就是說,parseInt把傳過來的索引值當成進制數來使用.從而返回了NaN.

/*
//應該使用以下的用戶函數returnInt

function returnInt(element){
return parseInt(element,10);
}

["1", "2", "3"].map(returnInt);
// 返回[1,2,3]
*/

瀏覽器兼容性

Feature Firefox (Gecko) Chrome Internet Explorer Opera Safari
Basic support (Yes) (Yes) 9 (Yes) (Yes)

Safari
Basic support (Yes) (Yes) 9 (Yes) (Yes)函數

相關文章
相關標籤/搜索