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)

  • 相关阅读:
    [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招
    [收藏转贴]构建RESTful风格的WCF服务
    [转贴] C/C++中动态链接库的创建和调用
    [转贴]WebService的简单实现 C++
    谷歌已经对Android的开源严防死守
    如何成为一名黑客?
    当程序员思路被打断
    编辑语言是这样的
    开发者需要掌握多少门语言?
    程序员的六大优势
  • 原文地址:https://www.cnblogs.com/hailiang2013/p/3543126.html
Copyright © 2011-2022 走看看