zoukankan      html  css  js  c++  java
  • javascript中的map和reduce

    今天在看“廖雪峰官方网站”的js教程时,看到了map和reduce。其中有一个练习题是:不使用js内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数(先将字符串转换为数组,再将数组转换为从arr[0]到arr[arr.(length-1)]的一个数字。比如:把[1, 3, 5, 7, 9]变换成整数13579。

    我的解法:

     function toNum(str)
            {
                var arr=[];
                for(var i=0;i<str.length;i++)
                {
                    arr.push(str[i]);
                }
                var num=arr.reduce(function(x,y)
                {
                    return x * 10 + y;
                })
                alert(num);
            }
           toNum('123');

    但是上述结果弹出的却是“10203”。经过测验,原因有以下几点:

    1,对于for循环得到的arr数组,得到的是['1','2','3'],而非[1,2,3]。即数组中的每个元素是字符串而非数字。

    function toNum(str)
    	    {
    	    	var arr=[];
    	    	for(var i=0;i<str.length;i++)
    	    	{
    	    		arr.push(str[i]);
    	    	}
    	    	return arr;
    	    }
           toNum('123');
    //返回["1", "2", "3"]

    2,字符串和数字相减乘除得到的是数字,字符串和数字相加得到的仍是字符串

    "1"*10+2;
    //返回12
    "1"*10+"2";
    //返回"102"
    

    更正方案一:将for循环得到的第一个数组中的字符串和0相减,得到一个都是数字的数组,再对该数组施加reduce函数。

     function toNum(str)
    	    {
    	    	var arr=[];
    	    	for(var i=0;i<str.length;i++)
    	    	{
    	    		arr.push(str[i]);
    	    	}
    	    	var arrn=arr.map(function(x){return x-0})
    	    	var num=arrn.reduce(function(x,y)
    	    	{
    	    		return x * 10 + y;
    	    	})
    	    	alert(num);
    	    }
           toNum('123');
    

     再次简化,利用字符串的split方法:

    function toNum(str)
    	    {
    	    	var arr=str.split('');//split方法返回的数组中每个元素仍是字符串
    	    	var arrn=arr.map(function(x){return x-0})
    	    	var num=arrn.reduce(function(x,y)
    	    	{
    	    		return x * 10 + y;
    	    	})
    	    	alert(num);
    	    }
    toNum('123');
    

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

    我的解法:

    function norm(arr)
    	{
    		var arrn=[];
    	    for (var i=0;i<arr.length;i++)
    	    {
    	    	arrn.push(
    	    		arr[i][0].toUpperCase()+
    	    		arr[i].substring(1).toLowerCase());    			    
    	    }
    	    alert(arrn);
    	}
    norm(['A dam', 'Lisa', 'Bart']);
    

      

      

     补充:关于substring()与slice().

    substring():substring() 方法用于提取字符串中介于两个指定下标之间的字符。

    语法:stringObject.substring(start,stop)。substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。

    slice():slice() 方法可从已有的数组中返回选定的元素。  

    语法:arrayObject.slice(start,end)。返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

     

  • 相关阅读:
    进程和程序
    linux socket基本知识
    window核心编程 第五章 作业
    树的基本操作(C语言)
    每天都在反省自己,但是每天却都浑浑噩噩
    Windows核心编程 内核对象
    还没完整看过一本技术的书籍啊
    管道
    Memory Layout of a C Program(7.6)
    cpio命令用法
  • 原文地址:https://www.cnblogs.com/yangfang228/p/6431005.html
Copyright © 2011-2022 走看看