举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个数组上,就可以用map实现如下:

    由于map()方法定义在JavaScript的Array中,我们调用Arraymap()方法,传入我们自己的函数,就得到了一个新的Array作为结果:

    map/reduce - 图2

    注意:map()传入的参数是pow,即函数对象本身。

    你可能会想,不需要map(),写一个循环,也可以计算出结果:

    的确可以,但是,从上面的循环代码,我们无法一眼看明白“把f(x)作用在Array的每一个元素并把结果生成一个新的Array”。

    所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把Array的所有数字转为字符串:

    只需要一行代码。

    比方说对一个Array求和,就可以用reduce实现:

    练习:利用reduce()求积:

    要把[1, 3, 5, 7, 9]变换成整数13579,reduce()也能派上用场:

    如果我们继续改进这个例子,想办法把一个字符串13579先变成Array——[1, 3, 5, 7, 9],再利用就可以写出一个把字符串转换为Number的函数。

    练习:不要使用JavaScript内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数:

    map/reduce - 图4

    请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

    map/reduce - 图6

    结果竟然是1, NaN, NaN,小明百思不得其解,请帮他找到原因并修正代码。

    提示:参考。

    原因分析

    由于map()接收的回调函数可以有3个参数:callback(currentValue, index, array),通常我们仅需要第一个参数,而忽略了传入的后面两个参数。不幸的是,parseInt(string, radix)没有忽略第二个参数,导致实际执行的函数分别是:

    • parseInt(‘1’, 0); // 1, 按十进制转换

    • parseInt(‘3’, 2); // NaN, 按二进制转换不允许出现3

    可以改为r = arr.map(Number);,因为Number(value)函数仅接收一个参数。