zoukankan      html  css  js  c++  java
  • Array迭代方法map

    What is the result of this expression? (or multiple ones) 
    ["1", "2", "3"].map(parseInt) 
    A:["1", "2", "3"]
    B:[1, 2, 3]
    C:[0, 1, 2]
    D:other

    概述:

    map方法 返回 一个由原数组中每个元素 调用一个指定方法后的返回值 组成的新数组.

    语法:

    array.map(callback[, thisArg])

    参数:

    callback原数组中的元素经过该方法后返回一个新的元素.
    thisArg执行callback函数时this指向的对象.

    描述:

    map 方法会给原数组中的每个元素(必须有值)都调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组.
    callback函数只会在有值的索引上被调用; 那些从来没被赋过值或者使用delete删除的索引则不会被调用.
    callback 函数会被自动传入三个参数: 数组元素, 元素索引,原数组本身.
    如果thisArg参数有值,则每次callback函数被调用的时候,this都会指向thisArg参数上的这个对象.如果省略了thisArg参数,或者赋值为null, 则this指向全局对象window.
    map不修改调用它的原数组本身.

    兼容性:

    map 是在最近的ECMA-262 标准中新添加的方法;所以一些旧版本的浏览器可能没有实现该方法.
    在那些没有原生支持map 方法的浏览器中.你可以使用下面的javascript代码来实现它.所使用的算法正是 ECMA-262,第5版规定的.
    假定Object, TypeError, 和 Array 有他们的原始值.而且callback.call的原始值也是 Function.prototype.call

    // 实现 ECMA-262, Edition 5, 15.4.4.19
    // 参考: http://es5.github.com/#x15.4.4.19
    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;
    
    // 4.如果callback不是函数,则抛出TypeError异常.
    if ({}.toString.call(callback) != "[object Function]") {
    throw new TypeError(callback + " is not a function");
    }
    
    // 5. 如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined.
    if (thisArg) {
    T = thisArg;
    }
    
    // 6. 创建新数组A,长度为原数组O长度len
    A = new Array(len);
    
    // 7. 将k赋值为0
    k = 0;
    
    // 8. 当 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++;
    }
    
    // 9. 返回新数组A
    return A;
    }; 
    }
    例子
    Example: 将数组中的单词转换成对应的复数形式.
    
    下面的代码将一个数组中的所有单词转换成对应的复数形式.
    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"]

    Example: 求数组中每个元素的平方根.

    下面的代码创建了一个新数组,值为原数组中对应数字的平方根.

    var numbers = [1, 4, 9];
    var roots = numbers.map(Math.sqrt);
    /* roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9] */

    Example: 在字符串上使用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]
    
    使用技巧案例
    通常情况下,map方法中的callback函数只需要接受一个参数,就是正在被遍历的数组元素本身. 
    但这并不意味着map只给callback传了一个参数.这个思维惯性可能会让我们犯一个很容易犯的错误.
    // 下面的语句返回什么呢:
    ["1", "2", "3"].map(parseInt);
    // 你可能觉的会是[1, 2, 3]
    // 但实际的结果是 [1, NaN, 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]
    */

    浏览器兼容性

    FeatureFirefox (Gecko)ChromeInternet ExplorerOperaSafari
    Basic support (Yes) (Yes) 9 (Yes) (Yes)

    Safari
    Basic support (Yes) (Yes) 9 (Yes) (Yes)

  • 相关阅读:
    33.数组声明方式(var构造函数) 、检测数组类型、数组的属性(封装好的就一个length)、数组的方法
    31.this指向(写出调用链,找最近对象) this的默认绑定 隐式绑定 显示绑定(call(绑定对象) apply(绑定对象) 当括号内没放绑定对象的时候恢复默认绑定) bind
    31.
    30.函数作用域链 (GO AO 也叫词法作用域链)、 调用栈、调用栈涉及this绑定
    29.包装类(构造函数) 包装类作用及调用栈
    916. Word Subsets
    246. Strobogrammatic Number
    445. Add Two Numbers II
    2. Add Two Numbers
    341. Flatten Nested List Iterator
  • 原文地址:https://www.cnblogs.com/hailiang2013/p/3543126.html
Copyright © 2011-2022 走看看