廖雪峰JavaScript教程笔记——map/reduce

练习1:

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

function string2int(s) {
    function str2num(str){
        var strArr = str.split('');               //把字符串分割成字符串数组
        function toInt(data){
            return +data;                  //通过js的弱类型转换,实现字符类型到数字类型的转换
        }
        var numArr = strArr.map(toInt);           //通过map()把字符串数组转换成数字数组
        return numArr;
    }
    var num = str2num(s);
    var res = num.reduce(function (x,y) {        //通过reduce()把数字数组转换成数字量
        return x*10+y;
    });
    return res;
}

练习2:

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

function normalize(arr) {
    function changetoName(name){
	 var newname = name[0].toUpperCase()+name.substring(1).toLowerCase();
         return newname;
    }
    return arr.map(changetoName); 
}

练习3:

小明希望利用map()把字符串变成整数,他写的代码很简洁:

var arr = ['1', '2', '3'];
var r;
r = arr.map(parseInt);
alert('[' + r[0] + ', ' + r[1] + ', ' + r[2] + ']');

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

arr.map会为调用的函数传入以下三个参数:
1、currentValue,数组中当前被传递的元素
2、index,数组中当前被传递的元素的索引
3、array,调用 map 方法的数组

而parseInt可以接受两个参数:
1、string:必需。要被解析的字符串。
2、radix:可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN

所以实际上是执行了:
parseInt(‘1’,0,[‘1’,’2’,’3’]);//1
parseInt(‘2’,1,[‘1’,’2’,’3’]);//NaN
parseInt(‘3’,2,[‘1’,’2’,’3’]);//NaN

所以修正的代码应为:

r = arr.map(function(x) { return parseInt(x,10) });
或者
r = arr.map(function(x) { return parseInt(x) });


你可能感兴趣的:(javascript)