1 语法数组
const new_array = arr.map(callback[, thisArg])
2 简单栗子浏览器
let arr = [1, 5, 10, 15]; let newArr = arr.map(function(x) { return x * 2; }); // arr is now [2, 10, 20, 30] // newArr is still [1, 5, 10, 15]
3 参数说明app
callback
生成新数组元素的函数,使用三个参数:
currentValue
callback 的第一个参数,数组中正在处理的当前元素。
index
callback 的第二个参数,数组中正在处理的当前元素的索引。
array
callback 的第三个参数,map 方法被调用的数组。
thisArg
可选的。执行 callback 函数时 使用的this 值。
4 返回值dom
一个新数组,每一个元素都是回调函数的结果。ide
5 详细说明函数
map 方法会给原数组中的每一个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来造成一个新数组。 callback 函数只会在有值的索引上被调用;那些历来没被赋过值或者使用 delete 删除的索引则不会被调用。
callback 函数会被自动传入三个参数:数组元素,元素索引,原数组自己。
若是 thisArg 参数有值,则每次 callback 函数被调用的时候,this 都会指向 thisArg 参数上的这个对象。若是省略了 thisArg 参数,或者赋值为 null 或 undefined,则 this 指向全局对象 。
map 不修改调用它的原数组自己(固然能够在 callback 执行时改变原数组)。
使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用以前就已经肯定了。在 map 方法执行的过程当中:原数组中新增长的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。
6 示列this
6.1 使用map格式化数组中的对象spa
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; }); // reformattedArray is now [{1:10}, {2:20}, {3:30}], // kvArray is still [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}]
6.2 字符串使用map方法进行遍历prototype
var str="aabccd"; var obj={}; [].map.call(str,function(x,y,z){ if(!obj[x]){ obj[x]=1 }else{ obj[x]+=1 } }); //直接使用字符串的遍历器接口 ES6 for (let x of str) {console.log(x)} // obj is {a: 2, b: 1, c: 2, d: 1}
6.3 反转字符串code
var str = '12345'; var reverseStr = Array.prototype.map.call(str, function(x) { return x; }).reverse().join(''); // reverseStr is '54321'
6.4 遍历dom元素节点
var elems = document.querySelectorAll("div"); var classNames = Array.prototype.map.call(elems, function(obj) { return obj.className; }); console.log("获取页面中全部div元素使用的class",classNames);
7 兼容旧浏览器
在那些没有原生支持 map
方法的浏览器中,你能够使用下面的 Javascript 代码来实现它。
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; // 3.若是callback不是函数,则抛出TypeError异常. if (Object.prototype.toString.call(callback) != "[object Function]") { throw new TypeError(callback + " is not a function"); } // 4. 若是参数thisArg有值,则将T赋值为thisArg;不然T为undefined. if (thisArg) { T = thisArg; } // 5. 建立新数组A,长度为原数组O长度len A = new Array(len); // 6. 将k赋值为0 k = 0; // 7. 当 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++; } // 8. 返回新数组A return A; }; }