Array.prototype.map()

1 语法

  1. const new_array = arr.map(callback[, thisArg])

2 简单栗子

  1. let arr = [1, 5, 10, 15];
  2. let newArr = arr.map(function(x) {
  3. return x * 2;
  4. });
  5. // arr is now [2, 10, 20, 30]
  6. // newArr is still [1, 5, 10, 15]

3 参数说明

  1. callback
  2. 生成新数组元素的函数,使用三个参数:
  3. currentValue
  4. callback 的第一个参数,数组中正在处理的当前元素。
  5. index
  6. callback 的第二个参数,数组中正在处理的当前元素的索引。
  7. array
  8. callback 的第三个参数,map 方法被调用的数组。
  9. thisArg
  10. 可选的。执行 callback 函数时 使用的this 值。

4 返回值

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

5 详细说明

  1. map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
  2.  
  3. callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
  4.  
  5. 如果 thisArg 参数有值,则每次 callback 函数被调用的时候,this 都会指向 thisArg 参数上的这个对象。如果省略了 thisArg 参数,或者赋值为 null undefined,则 this 指向全局对象
  6.  
  7. map 不修改调用它的原数组本身(当然可以在 callback 执行时改变原数组)。
  8.  
  9. 使用 map 方法处理数组时,数组元素的范围是在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中新增加的元素将不会被 callback 访问到;若已经存在的元素被改变或删除了,则它们的传递到 callback 的值是 map 方法遍历到它们的那一时刻的值;而被删除的元素将不会被访问到。

6 示列

6.1 使用map格式化数组中的对象

  1. var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}];
  2. var reformattedArray = kvArray.map(function(obj){
  3. var rObj = {};
  4. rObj[obj.key] = obj.value;
  5. return rObj;
  6. });
  7. // reformattedArray is now [{1:10}, {2:20}, {3:30}],
  8. // kvArray is still [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}]

6.2 字符串使用map方法进行遍历

  1. var str="aabccd";
  2. var obj={};
  3. [].map.call(str,function(x,y,z){
  4. if(!obj[x]){
  5. obj[x]=1
  6. }else{
  7. obj[x]+=1
  8. }
  9. });
  10. //直接使用字符串的遍历器接口 ES6
  11. for (let x of str) {console.log(x)}
  12. // obj is {a: 2, b: 1, c: 2, d: 1}

6.3 反转字符串

  1. var str = '12345';
  2. var reverseStr = Array.prototype.map.call(str, function(x) {
  3. return x;
  4. }).reverse().join('');
  5. // reverseStr is '54321'

6.4 遍历dom元素节点

  1. var elems = document.querySelectorAll("div");
  2. var classNames = Array.prototype.map.call(elems, function(obj) {
  3. return obj.className;
  4. });
  5. console.log("获取页面中所有div元素使用的class",classNames);

7 兼容旧浏览器

在那些没有原生支持 map 方法的浏览器中,你可以使用下面的 Javascript 代码来实现它。

  1. if (!Array.prototype.map) {
  2. Array.prototype.map = function(callback, thisArg) {
  3.  
  4. var T, A, k;
  5.  
  6. if (this == null) {
  7. throw new TypeError(" this is null or not defined");
  8. }
  9.  
  10. // 1. 将O赋值为调用map方法的数组.
  11. var O = Object(this);
  12.  
  13. // 2.将len赋值为数组O的长度.
  14. var len = O.length >>> 0;
  15.  
  16. // 3.如果callback不是函数,则抛出TypeError异常.
  17. if (Object.prototype.toString.call(callback) != "[object Function]") {
  18. throw new TypeError(callback + " is not a function");
  19. }
  20.  
  21. // 4. 如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined.
  22. if (thisArg) {
  23. T = thisArg;
  24. }
  25.  
  26. // 5. 创建新数组A,长度为原数组O长度len
  27. A = new Array(len);
  28.  
  29. // 6. 将k赋值为0
  30. k = 0;
  31.  
  32. // 7. 当 k < len 时,执行循环.
  33. while(k < len) {
  34.  
  35. var kValue, mappedValue;
  36.  
  37. //遍历O,k为原数组索引
  38. if (k in O) {
  39.  
  40. //kValue为索引k对应的值.
  41. kValue = O[ k ];
  42.  
  43. // 执行callback,this指向T,参数有三个.分别是kValue:值,k:索引,O:原数组.
  44. mappedValue = callback.call(T, kValue, k, O);
  45.  
  46. // 返回值添加到新数组A中.
  47. A[ k ] = mappedValue;
  48. }
  49. // k自增1
  50. k++;
  51. }
  52.  
  53. // 8. 返回新数组A
  54. return A;
  55. };
  56. }

Array.prototype.map()方法详解的更多相关文章

  1. Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解

    Jquery遍历筛选数组的几种方法和遍历解析json对象|Map()方法详解 一.Jquery遍历筛选数组 1.jquery grep()筛选遍历数组 $().ready( function(){ v ...

  2. JavaScript中Array.prototype.sort()的详解

    摘抄来源:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sor ...

  3. Array.prototype.slice用法详解

    slice方法是定义在js数组原型中的方法,用于截取数组的部分元素,具体使用如下: arrayExample.slice(start, end); start为起始元素位置,end为截止元素位置,如: ...

  4. JavaScript中数组Array.sort()排序方法详解

    JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...

  5. JavaScript中数组Array方法详解

    ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...

  6. Array.prototype.map()详解

    今天在地铁上看到这样一个小例子: ["1","2","3"].map(parseInt); 相信很多人和我一样,觉得输出的结果是[1,2,3 ...

  7. Javascript中Array.prototype.map()详解

    map 方法会给原数组中的每个元素都按顺序调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback 函数只会在有值的索引上被调用:那些从来没被赋 ...

  8. 5个现在就该使用的数组Array方法: indexOf/filter/forEach/map/reduce详解(转)

    ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.然而,这些新奇的数组方法并没有真正流行起来的,因为当时市场上缺乏支持ES5的浏览器.     ...

  9. JS Array常用方法indexOf/filter/forEach/map/reduce详解

    Array共有九个方法   Array.prototype.indexOf Array.prototype.lastIndexOf Array.prototype.every Array.protot ...

随机推荐

  1. Android开发——蓝牙

    ---恢复内容开始--- 前言 孤芳自赏,一揽芳华: 人情冷暖,自在人心: 登高远眺,望步止前: 喜笑言开,欺人骗己. 上篇文章介绍了基本的蓝牙使用,书写的demo也不是很完善,希望各位大神能够改正. ...

  2. 读取.properties配置信息

    package com.ctcti.webcallcenter.utils; import java.io.FileInputStream;import java.io.FileNotFoundExc ...

  3. python_函数的可变参数

    def test(*args,**kwargs): print(args) print(kwargs) test(1,2,3,x=1,y=2) 运行结果: *args称为positional argu ...

  4. fedora安装gcc

    查看gcc版本 gcc --version 命令行编译 g++ -std=c++11 -o main main.cpp 查看程序是否编译成功 echo $? 返回0表示编译成功 新版的Fedora(2 ...

  5. jQuery 点击 星星评分

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 输出所有进程和进程ID

    #include <windows.h> #include <tlhelp32.h> #include <tchar.h> #include <stdio.h ...

  7. 手动配置webpack

    //注:“__dirname”是node.js中的一个全局变量,它指向当前执行脚本所在的目录.const path = require('path');const webpack = require( ...

  8. 二维码之zxing仿新浪微博二维码

    在前言中最后部分,提到了二维码开发工具资源ZXing.网上有它最新1.7版的源码,感兴趣的可以下载下来看看,要打包生成core比较麻烦,网上有相关教程.嫌麻烦的朋友,可以去我的资源里下载Java版的c ...

  9. Unexpected token d in JSON at position 669 while parsing near '...ct-mode":"^6.0.2"}

    问题 在安装 babel 的时候,遇到问题 Unexpected token d in JSON at position 669 while parsing near '...ct-mode" ...

  10. 杀了个回马枪,还是说说position:sticky吧

    <style> article { max-width: 600px; margin: 1em auto; } article h4, article footer { position: ...