map()
方法建立一個新數組,其結果是該數組中的每一個元素都調用一個提供的函數後返回的結果。數組
let new_array = arr.map(function callback(currentValue, index, array) { // Return element for new_array }[, thisArg])
callback
生成新數組元素的函數,使用三個參數:
currentValue
數組中正在處理的當前元素。index
數組中正在處理的當前元素的索引。array
map 方法被調用的數組。thisArg
可選的。執行 callback
函數時 使用的this
值。原理dom
var numbers = [1, 4, 9]; var roots = numbers.map(Math.sqrt); console.log(numbers) // [1, 4, 9] console.log(roots) // [1, 2, 3]
封裝函數
var numbers = [1, 4, 9]; const arrBat = (arr, func) => arr.map(func) var roots = arrBat(numbers, Math.sqrt) console.log(numbers) // [1, 4, 9] console.log(roots) // [1, 2, 3]
只須要傳入對應的處理方法,便可對數組全部元素作批處理。this
固然也可對此方法進行二次封裝:prototype
var numbers = [1, 4, 9]; const arrBat = (arr, func) => arr.map(func) const arrToSqrt = (arr) => arrBat(arr, Math.sqrt) // 開平方根 const arrToSquare = (arr) => arrBat(arr, e => Math.pow(e, 2)) // 平方 const arrToRound = (arr) => arrBat(arr, Math.round) // 四捨五入 const arrToCeil = (arr) => arrBat(arr, Math.ceil) // 求上整 const arrToFloor = (arr) => arrBat(arr, Math.floor) // 求下整 const arrToDouble = (arr) => arrBat(arr, e => 2 * e) // 求倍數 arrToSquare(numbers) // [1, 16, 81] arrToSqrt(numbers) // [1, 2, 3]
先看下面一個方法:code
["1", "2", "3"].map(parseInt);
第一反應,這裏應該返回的是 [1, 2, 3]
,然而,實際上返回的倒是 [1, NaN, NaN]
。orm
這是爲何呢?對象
事實上,parseInt
接收兩個參數,第一個是原始值,第二個是進制值,一般咱們使用 parseInt('5')
相似的操做,其實是默認第二參數爲 10,。但注意,在 map
回調函數中,有三個參數,第一個是遍歷出來的每個元素,第二參數爲遍歷出的元素的下標,第三參數爲調用者自己。這裏, parseInt
接到了 map
的前兩個參數,也就是元素和下標,第三參數被忽略,parseInt
把傳過來的索引值當成進制數來使用,從而返回了NaN。索引
正確的作法是:ci
const arrToInt = str => Array.prototype.map.call(str, e => parseInt(e, 10)) arrToInt("57832") // [5, 7, 8, 3, 2] arrToInt([1.2, 3.4, 9.6]) // [1, 3, 9]
與 parseInt
不一樣,下面的結果會返回浮點數或指數 :
['1.1', '2.2e2', '3e300'].map(Number); // [1.1, 220, 3e+300]
原理
var kvArray = [{key: 1, value: 10}, {key: 2, value: 20}, {key: 3, value: 30}] var reformattedArray = kvArray.map(function(obj) { var rObj = {}; rObj[obj.key] = obj.value; return rObj; }); // [{1: 10}, {2: 20}, {3: 30}],
封裝
var kvArray = [{key: 1, value: 10}, {key: 2, value: 20}, {key: 3, value: 30}] kvArrayToObjArray = (obj) => obj.map(e => { var rArr = []; rArr.push(e.key, e.value); return rArr; }) var reformattedArray = kvArrayToObjArray(kvArray) // [[1, 10], [2, 20], [3, 30]]
原理
var str = 'Hello'; Array.prototype.map.call(str, function(x) { return x; }).reverse().join(''); // 'olleH'
封裝
const reverseStr = str => Array.prototype.map.call(str, e => e).reverse().join('') c = reverseStr('Hello') // 'olleH'
固然,還有一個更簡單的反轉字符串方法,使用 ES6 的解構便可
const reverseString = str => [...str].reverse().join(''); reverseString('foobar') // 'raboof'
原理
var a = Array.prototype.map.call("Hello World", function(x) { return x.charCodeAt(0); }) // [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
封裝
const strToAscii = str => Array.prototype.map.call(str, e => e.charCodeAt(0)) strToAscii("Hello World") // [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
甚至可使用 map 對 DOM 進行操做
var elems = document.querySelectorAll('select option:checked'); var values = Array.prototype.map.call(elems, function(obj) { return obj.value; });