zoukankan      html  css  js  c++  java
  • Array.prototype.map()方法详解

    Array.prototype.map()

    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 参数说明

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

    4 返回值

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

    5 详细说明

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

    6 示列

     6.1 使用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 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方法进行遍历

    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 反转字符串

    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;
      };      
    }
    View Code
  • 相关阅读:
    AttributeError: 'DatasetV1Adapter' object has no attribute 'group_by_window'版本兼容问题解决
    Jupyter kernel管理
    AttributeError: module 'tensorflow_core._api.v2.nn' has no attribute 'rnn_cell' tensorflow版本兼容问题-解决
    在虚拟机Linux中安装VMTools遇到的问题-小结
    VuGen总结
    Controller控制器
    事物
    loadrunner参数化
    编写get和post请求
    loadrunner组成
  • 原文地址:https://www.cnblogs.com/weboey/p/6606985.html
Copyright © 2011-2022 走看看