美文网首页
Math数组Date

Math数组Date

作者: 阿鲁提尔 | 来源:发表于2017-08-08 18:51 被阅读0次

    Math

    1、写一个函数,返回从min到max之间的随机整数,包括min不包括max
      function random(a,b){
        return a+Math.floor(Math.random()*(b-a))
      }
    
    2、写一个函数,返回从min都max之间的随机整数,包括min包括max
      function random(a,b){
        return a+Math.floor(Math.random()*(b-a+1))
      }
    
    3、写一个函数,生成一个长度为 n 的随机字符串,字符串字符的取值范围包括0到9,a到 z,A到Z。
      function random(a,b){
        return a+Math.floor(Math.random()*(b-a))
      }
      // 返回随机字符串
      function getRandStr(len){
         var dict='1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
         var str = ''
          for(var i = 0 ; i < len ;i++){
            str = str +dict[random(0,62)]
          }
          return str;
       }
       var str = getRandStr(10);
       console.log(str)  //随机输出一个10位的字符串
    
    4、写一个函数,生成一个随机 IP 地址,一个合法的 IP 地址为 0.0.0.0~255.255.255.255
      function random(a,b){
        return a+Math.floor(Math.random()*(b-a))
      }
      // 随机获取ip
      function getRandIP(){
        var arr = []    //声明一个空数组
        for(var i =0;i<4;i++){
          arr.push(random(0,256))
        }
      return arr.join('.')    //每个数值中间添加'.'分割
      }
      var ip = getRandIP()
      console.log(ip) // 10.234.121.45
    
    5、写一个函数,生成一个随机颜色字符串,合法的颜色为#000000~ #ffffff
      function random(a,b){
        return a+Math.floor(Math.random()*(b-a))
      }
      function getRandColor(){
        var dict='0123456789ABCDEFabcdef'  //随机库
        var str = ''     
          for(var i = 0 ; i < 6 ;i++){
            str = str +dict[random(0,22)];
          }
            return '#' + str; 
          }
      var color = getRandColor()
      console.log(color)  //随机输出一个颜色
    

    数组

    1、数组方法里push、pop、shift、unshift、join、splice分别是什么作用?用 splice函数分别实现push、pop、shift、unshift方法
    • push,pop(栈方法)

    我们很多时候希望删除中间一个元素后,后面元素的index都自动减一,数组length同时减一,就好像在一个堆栈中拿去的一个,数组已经帮我们做好了这种操作方式,poppush能够让我们使用堆栈那样先入后出使用数组。
    作用:push用来在数组末尾添加数值pop用来删除数组末尾一个数值

      var a = new Array(1,2,3);
      a.push(4);   //在末尾添加数值4
      console.log(a);//[1, 2, 3, 4]
      console.log(a.length);//4
      console.log(a.pop());//4
      console.log(a); //[1, 2, 3]
      console.log(a.length);//3
    
    • shift,unshift(队列方法)

    既然栈方法都实现了,先入先出的队列怎么能少,shift方法可以删除数组index最小元素,并使后面元素index都减一,length也减一,这样使用shift/push就可以模拟队列了,当然与shift方法对应的有一个unshift方法,用于向数组头部添加一个元素
    作用:unshift往数组的第一个位置添加一个数值;shift删除数组的第一个数值

      var a=new Array(1,2,3);
      a.unshift(4);   //数组第一位添加数值4
      console.log(a);//[4, 1, 2, 3]
      console.log(a.length);//4    
      console.log(a.shift());//4    //删除数组第一位
      console.log(a); //[1, 2, 3]
      console.log(a.length);//3
    
    • join

    这个方法在C#等语言中也有,作用是把数组元素(对象调用其toString()方法)使用参数作为连接符连接成一字符串,不会修改原数组内容

      var a = new Array(1,2,3,4,5);
      console.log(a.join(',')); //1,2,3,4,5
      console.log(a.join(' ')); //1 2 3 4 5
    
    • splice(终极神器)推荐指数:★★★★★

    JavaScript提供了一个splice方法用于一次性解决数组添加、删除(这两种方法一结合就可以达到替换效果),方法有三个参数

    • 1.开始索引
    • 2.删除元素的位移
    • 3.插入的新元素,当然也可以写多个
      splice方法返回一个由删除元素组成的新数组,没有删除则返回空数组
      var a = new Array(1,2,3,4,5);
    
    删除

    指定前两个参数,可以使用splice删除数组元素,同样会带来索引调整及length调整

      var a = new Array(1,2,3,4,5);
      console.log(a.splice(1,3));//[2, 3, 4]
      console.log(a.length);//2
      console.log(a);//[1,5]
    

    如果数组索引不是从0开始的,那么结果会很有意思,有一这样数组

      var a = new Array();
      a[2]=2;
      a[3]=3;
      a[7]=4;
      a[8]=5;
    
    console.log(a.splice(3,4)); //[3]
    console.log(a.length); //5
    console.log(a); //[2: 2, 3: 4, 4: 5]
    

    上面例子可以看到,splice的第一个参数是绝对索引值,而不是相对于数组索引,第二个参数并不是删除元素的个数,而是删除动作执行多少次,并不是按数组实际索引移动,而是连续移动。同时调整后面元素索引,前面索引不理会

    插入与替换

    只要方法第二个参数,也就是删除动作执行的次数设为0,第三个参数及以后填写要插入内容就splice就能执行插入操作,而如果第二个参数不为0则变成了先在该位置删除再插入,也就是替换效果

      var a = new Array(1,2,3,4,5);
      a.splice(1,0,9,99,999);
      console.log(a.length); //8
      console.log(a);//[1, 9, 99, 999, 2, 3, 4, 5]
      a.splice(1,3,8,88,888);
      console.log(a.length);//8
      console.log(a);//[1, 8, 88, 888, 2, 3, 4, 5]
    
    • 用 splice函数分别实现push、pop、shift、unshift方法
      var arr = [1,2,3,4,5,6,7]
      arr.splice(7,0,8)   //相当于arr.push(8)在末尾添加数值8
      arr.splice(7,1)   //8  相当于arr.pop()  删除最后一个数值 
      arr.splice(0,0,1)   // 相当于arr.unshift(0)  在数组首添加数值0 
      arr.splice(0,1)    // 相当于arr.shift() 删除数组首个数值
      
    

    其他操作

    • slice(start,end)

    不要和splice方法混淆,slice方法用于返回数组中一个片段或子数组,如果只写一个参数返回参数到数组结束部分,如果参数出现负数,则从数组尾部计数(-3意思是数组倒第三个,一般人不会这么干,但是在不知道数组长度,想舍弃后n个的时候有些用,不过数组长度很好知道。。。。,好纠结的用法),如果start大于end返回空数组,值得注意的一点是slice不会改变原数组,而是返回一个新的数组
    (通俗的来讲,抽出一个数组,start是开始的数组位置,end是结束的数组位置,如果end为负就是倒着数,start>end(除非为负值),不会影响原数组)

      var a = new Array(1,2,3,4,5);
      console.log(a); //[1, 2, 3, 4, 5]
      console.log(a.slice(1,2));//2
      console.log(a.slice(1,-1));//[2, 3, 4]
      console.log(a.slice(3,2));//[]
      console.log(a); //[1, 2, 3, 4, 5]
    
    • concat(array)

    看起来像是剪切,但这个真不是形声字,concat方法用于拼接数组,a.concat(b)返回一个a和b共同组成的新数组,同样不会修改任何一个原始数组,也不会递归连接数组内部数组

      var a = new Array(1,2,3,4,5);
      var b = new Array(6,7,8,9);
      console.log(a.concat(b));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
      console.log(a); //[1, 2, 3, 4, 5]
      console.log(b); //[6, 7, 8, 9]
    
    • reverse()

    方法用于将数组逆序,与之前不同的是它会修改原数组

      var a = new Array(1,2,3,4,5);
      a.reverse();
      console.log(a); //[5, 4, 3, 2, 1]
    

    同样,当数组索引不是连续或以0开始,结果需要注意

      var a = new Array();
      a[2]=2;
      a[3]=3;
      a[7]=4;
      a[8]=5;
    
      a.reverse();
    
    • sort

    sort方法用于对数组进行排序,当没有参数的时候会按字母表升序排序,如果含有undefined会被排到最后面,对象元素则会调用其toString方法,如果想按照自己定义方式排序,可以传一个排序方法进去,很典型的策略模式,同样sort会改变原数组。

      var a=new Array(5,4,3,2,1);
      a.sort();
      console.log(a);//[1, 2, 3, 4, 5]
    

    但是。。。

      var a=new Array(7,8,9,10,11);
      a.sort();
      console.log(a);//[10, 11, 7, 8, 9]
    

    因为按照字母表排序,7就比10大了,这时候我们需要传入自定义排序函数

      var a = new Array(7,8,9,10,11);
    
      a.sort(function(v1,v2){
          return v1-v2;
      });
      console.log(a);//[7, 8, 9, 10, 11]
    

    sort内部使用快速排序,每次比较两个元素大小的时候如果没有参数,则直接判断字母表,如果有参数,则把正在比较的两个参数传入自定义方法并调用(正在比较的两个数会传给自定义方法的v1、v2),如果返回值大于0表示v1 > v2,如果等于0,表示v1 = v2,如果小于0,表示v1 < v2,其实我们传入的方法就是告诉sort怎么比较两个元素谁大谁小,至于排序移动元素过程人家写好了

    2、写一个函数,操作数组,数组中的每一项变为原来的平方,在原数组上操作
      function squareArr(arr){
        for(var i = 0 ; i<arr.length;i++){
          arr[i]=arr[i]*arr[i];
        }
        return arr
      }
      var arr = [2, 4, 6]
      squareArr(arr)
      console.log(arr) // [4, 16, 36]
    
    3、写一个函数,操作数组,返回一个新数组,新数组中只包含正数,原数组不变
      function filterPositive(arr){
        var newArr = [];
        for(var i = 0; i < arr.length; i++){
            if(arr[i] > 0 && arr[i] !== true){
                newArr.push(arr[i]);
            }
        }
        return nweArr;
        }
      var arr = [3, -1,  2,  '饥人谷', true]
      var newArr = filterPositive(arr)
      console.log(newArr) //[3, 2]
      console.log(arr) //[3, -1,  2,  '饥人谷', true]
    

    Date

    1、 写一个函数getChIntv,获取从当前时间到指定日期的间隔时间
      function getChintv(dateStr){
        var targetDate = new Date(dateStr);    //获取截止时间
        var presentDate = new Date();    //当前时间设置
        var offset = Math.abs(targetDate-presentDate);    
        //目标时间减去当前时间
    
        var totalSeconds = Math.abs(offset/1000);  //总毫秒转化为总秒数
        var second = Math.floor(totalSeconds%60);  //求余,得到秒数
        var totalMinutens = totalSeconds/60;    //总秒数转为总分钟
        var minuten = Math.floor(totalMinutens%60);  //求余,得到分钟
        var totalHours = totalMinutens/60;  //总分钟数转为总小时数
        var hours = Math.floor(totalHours%60);  //求余,得到小时
        var totalDays = totalHours/60;  //总小时数转为总天数
        var days = Math.floor(totalDays%24);  //求余,得到天数
        
        return days + '天' + hours + '小时' + minuten + '分' + second + '秒'
            }
      var d = getChintv('2017-10-8')
      console.log(d);  // 输出时间
    
    2、把hh-mm-dd格式数字日期改成中文日期
      function getChsDate(str){
        var dict = ["零","一","二","三","四","五","六","七","八","九","十","十一",
        "十二","十三","十四","十五","十六","十七","十八","十九","二十","二十一",
        "二十二","二十三","二十四","二十五","二十六","二十七","二十八","二十九","三十",
        "三十一"];  //汉字数组
        var arr = str.split('-');    //去掉-,变为数组
        var totalYear = arr[0];    
        var totalMonth = arr[1];
        var totalDay = arr[2];
    
        var year = dict[totalYear[0]] + dict[totalYear[1]] + dict[totalYear[2]] 
                   + dict[totalYear[3]] + '年';
        var month = dict[totalMonth[0]] + dict[totalMonth[1]] + '月';
        var day = dict[totalDay[0]] + dict[totalDay[1]]+'日'
    
        return year + month + day;
      }
    
      var str = getChsDate('2015-01-08');
      console.log(str);  // 二零一五年一月八日
    
    3、写一个函数,参数为时间对象毫秒数的字符串格式,返回值为字符串。假设参数为时间对象毫秒数t,根据t的时间分别返回如下字符串:
    • 刚刚( t 距当前时间不到1分钟时间间隔)
    • 3分钟前 (t距当前时间大于等于1分钟,小于1小时)
    • 8小时前 (t 距离当前时间大于等于1小时,小于24小时)
    • 3天前 (t 距离当前时间大于等于24小时,小于30天)
    • 2个月前 (t 距离当前时间大于等于30天小于12个月)
    • 8年前 (t 距离当前时间大于等于12个月)
      function friendlyDate(time){
        var offset = Date.now()-time;
          if(offset<(60*1000)){
            console.log("刚刚")
          }else if(offset<(60*60*1000)){
            console.log(Math.floor(offset/(60*1000))+'分钟前')
          }else if(offset<(24*60*60*1000)){
            console.log(Math.floor(offset/(60*60*1000))+'小时前')
          }else if(offset<(30*24*60*60*1000)){
            console.log(Math.floor(offset/(24*60*60*1000))+'天前')
          }else if(offset<(12*30*24*60*60*1000)){
            console.log(Math.floor(offset/(30*24*60*60*1000))+'月前')
          }else{
            console.log(Math.floor(offset/(12*30*24*60*60*1000))+'年前')
          }
        }
      var str = friendlyDate( '1484286699422' ) //  6个月前
      var str2 = friendlyDate('1483941245793') //7个月前
    

    相关文章

      网友评论

          本文标题:Math数组Date

          本文链接:https://www.haomeiwen.com/subject/catnlxtx.html