一、概念
map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

二、语法

var new_array = arr.map(function callback(currentValue[, index[, array]]) {// Return element for new_array
}[, thisArg])

参数:
callback 生成新数组元素的函数,使用三个参数:
currentValue callback 数组中正在处理的当前元素。
index可选 callback 数组中正在处理的当前元素的索引。
array可选 callback map 方法被调用的数组。
thisArg可选 执行 callback 函数时使用的this 值。

返回值:
一个新数组,每个元素都是回调函数的结果。

三、描述
使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中新增加的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。

四、用法示例
① 求数组中每个元素的平方根

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
console.log(numbers);
console.log(roots);

打印结果:

(3) [1, 4, 9]
(3) [1, 2, 3]

② 使用 map 重新格式化数组中的对象

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 数组为: [{1: 10}, {2: 20}, {3: 30}],
// kvArray 数组未被修改:
// [{key: 1, value: 10},
//  {key: 2, value: 20},
//  {key: 3, value: 30}]

③ 使用一个包含一个参数的函数来mapping(构建)一个数字数组
当函数需要一个参数时map的工作方式:
当map循环遍历原始数组时,这个参数会自动被分配成数组中对应的每个元素

var numbers = [1, 4, 9];
var doubles = numbers.map(function (num) {return num * 2;
});
console.log(numbers);
console.log(doubles);

打印结果:

(3) [1, 4, 9]
(3) [2, 8, 18]

④ 一般的map 方法
如何在一个 String 上使用 map 方法获取字符串中每个字符所对应的 ASCII 码组成的数组:

var map = Array.prototype.map
var a = map.call("Hello World", function (x) {return x.charCodeAt(0);
})
console.log(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"来验证.)

console.log((parseInt.length)===2);  //true

map方法在调用callback函数时,会给它传递三个参数:当前正在遍历的元素,元素索引, 原数组本身。第三个参数parseInt会忽视,但第二个参数不会,也就是说:parseInt把传过来的索引值当成进制数来使用,从而返回了NaN
例如:

function returnInt(element) {return parseInt(element, 10);
}
['1', '2', '3'].map(returnInt);
// 打印结果:[1, 2, 3]
// 因为第二个参数表示进制,是10进制。
// 也可以使用简单的箭头函数,结果同上
['1', '2', '3'].map( str => parseInt(str) );
// 一个更简单的方式:
['1', '2', '3'].map(Number);               // [1, 2, 3]
// 与`parseInt` 不同,下面的结果会返回浮点数或指数:
['1.1', '2.2e2', '3e300'].map(Number);     // [1.1, 220, 3e+300]

参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map

arr.map()的使用相关推荐

  1. ES5-数组API:arr.indexOf、arr.every(条件)、arr.some(条件)、arr.forEach()遍历、arr.map()、filter过滤、reduce汇总

    1.arr.indexOf(3,2) 数组中也用indexOf方法,查找一个指定元素的位置 用法:同字符串.indexOf完全一样: var i = arr.indexOf(要找的元素,[开始的位置s ...

  2. [JS] 关于parseInt的一个小知识:[‘1‘, ‘2‘, ‘3‘].map(parseInt)

    主要是在笔试里看到了,自己试下.. let a = ['1', '2', '3'].map(parseInt) console.log(a) 运行结果: 反正当时是做错了,QAQ 查了一下原理,感谢大 ...

  3. Array.prototype.map() 、 Array.prototype.reduce()、Array.prototype.filter()

    文章目录 1. map 2. reduce 3. filter 1. map   map 函数接收一个回调函数作为参数,然后返回一个数组,这个数组中的每个元素都是调用回调函数后返回的结果.如: fun ...

  4. ['1','2','3'].map(parseInt)

    理解这道题的本质就在于: 对map第一个参数callback传参的理解 对parseInt的传参和转化字符的规则 其实就是考察我们平时对基础知识的API的掌握情况. Array.prototype.m ...

  5. map(&:name)在Ruby中是什么意思?

    我在RailsCast中找到了以下代码: def tag_names@tag_names || tags.map(&:name).join(' ') end 什么是(&:name)在m ...

  6. ['1', '2', '3'].map(parseInt) what why ?

    关于map和parseInt的函数解释developer.mozilla.org/zh-CN/docs/- 首先parseInt(string, radix) 接收两个参数,第一个表示被处理的值(字符 ...

  7. java 数组map_java中 数组 list map之间的互转

    三者之间转换关系,一张图清晰呈现. 上代码: 其中的maputils是apache的collection包. package util; import java.util.ArrayList; imp ...

  8. ES6 -Set 和 Map 数据结构

    一.set 1.set数据结构:类似数组,但是里面不能有重复值 2.set语法, new Set([]) let set=new Set([1,2,1]); console.log(set);// { ...

  9. 数组遍历 map()、forEach() 及 字符串切割 split() / 字符串截取 slice()、substring()、substr()...

    JS数组遍历的几种方式 JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代 ...

最新文章

  1. 也谈压缩感知和贝叶斯大脑
  2. C++实践参考——时间类
  3. jQuery获取Select选择的Text和 Value(转)
  4. dijkstra算法优化
  5. Ajax返回值问题思考
  6. poj1789 最小生成树
  7. Win10远程桌面 出现 身份验证错误,要求的函数不受支持,这可能是由于CredSSP加密Oracle修正 解决方法
  8. cmd mysql utf8_MySQL中UTF8编码的数据在cmd下乱码
  9. 浅谈数据结构之顺序队列(五)
  10. Ubuntu16.04安装卸载MongoDB
  11. 【work】输出日期为那一年的第几天
  12. 联想 M7400 pro Linux下 CUPS 驱动安装
  13. 【青少年编程】【三级】猫咪抓老鼠游戏
  14. 【C语言】输出杨辉三角形 - 杨辉直角三角形(杨辉三角最佳算法) 输出杨辉三角前十行
  15. 计算机nls数据丢失损坏无法启动,系统开机出现由于NLS数据丢失或损坏
  16. 【踩坑日记】python3.9安装paddlepaddle-tiny的时候报错ERROR: Could not find a version
  17. Abstract Introduction
  18. 利用js和jquary制作轮播图
  19. 2017京东春招实习生招聘编程题
  20. csdn--接口自动化测试之postman如何设置断言

热门文章

  1. python多轴图_python中用Matplotlib做多个纵轴 (多y轴)
  2. PS之人物通道磨皮法
  3. 大数据开发和java的前景_大数据开发和javaEE后端开发哪个就业前景好?
  4. PS制作文字扫描效果(仿旧效果)
  5. Cisco Packet Trancer中小型校园网/企业网/园区网网络设计规划/无线网络
  6. 抖音怎么开直播?抖音开播流程介绍
  7. html做图片模糊效果,CSS3 filter(滤镜) 制作图片高斯模糊无需JS
  8. JDK8之Optional
  9. NLP自然语言处理 集束搜索(beam search)和贪心搜索(greedy search)
  10. Android scheme链接打开本地应用