概述
map()
方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。
语法
array.map(callback[, thisArg])
参数
callback
- 原数组中的元素经过该方法后返回一个新的元素。
-
currentValue
-
callback
的第一个参数,数组中当前被传递的元素。 index
-
callback
的第二个参数,数组中当前被传递的元素的索引。 array
-
callback
的第三个参数,调用map
方法的数组。
thisArg
- 执行
callback
函数时this
指向的对象。
描述
map
方法会给原数组中的每个元素都按顺序调用一次 callback
函数。callback
每次执行后的返回值组合起来形成一个新数组。 callback
函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete
删除的索引则不会被调用。
callback
函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
如果 thisArg
参数有值,则每次 callback
函数被调用的时候,this
都会指向 thisArg
参数上的这个对象。如果省略了 thisArg
参数,
或者赋值为 null
或 undefined
,则 this 指向全局对象 。
map
不修改调用它的原数组本身(当然可以在 callback
执行时改变原数组)。
使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中新增加的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。
示例
例子:将数组中的单词转换成对应的复数形式.
下面的代码将一个数组中的所有单词转换成对应的复数形式.
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"]
例子:求数组中每个元素的平方根
下面的代码创建了一个新数组,值为原数组中对应数字的平方根。
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
/* roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9] */
例子:在字符串上使用 map
方法
下面的例子演示如在在一个 String
上使用 map 方法获取字符串中每个字符所对应的 ASCII 码组成的数组:
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]
高级技巧
1. 不使用loop,创建一个长度为100的数组
Array.apply(null, {length: 100}).map(Number.call, Number)
Array(100).join(",").split(",").map(function(key,index){return index;})
Object.keys(Array.apply(null, {length: 10}))
// 下面的语句返回什么呢:
["1", "2", "3"].map(parseInt);
// 你可能觉的会是[1, 2, 3]
// 但实际的结果是 [1, NaN, NaN]
parseInt('1', 0) 1
parseInt('2', 1) NaN
parseInt('3', 2) 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]
*/