js : 数组排序+算法+Math+字符串常用方法+Date

数组的常用方法

  • 增加,删除和替换:都是影响原始数组
    • push()
    • pop()
    • unshift()
    • shift()
    • splice()
      • splice(1) / splice(1,3) 删除
      • splice(2,0,'XXX') 添加
      • splice(2,2'XXX','XXX') 替换
  • 克隆和拼接
    • slice(n,m) 包前不包后
    • concat() 数组的拼接
  • 翻转和排序
    • reverse();
    • sort(function(n,m){return n-m});
  • 数组转字符串
    • toString()
    • join()
      • eval() 把字符串作为js代码来执;
  • 常用但不兼容的方法
    • indexOf()
    • forEsch()
    • map()

Math

  • Math.floor()
  • Math.ceil()
  • Math.abs()
  • Math.pow()
  • Math.sqrt()
  • Math.round()
  • Math.max()
  • Math.min()
  • Math.random()
    • 公式: Math.round(Math.random()*(m-n)+n)

数组去重

  • 双重循环
<script>
  for(var i=0;i<arr.length;i++){
    for(var j=i+1; j<ary.length; j++){
        if(ary[i]===ary[j]){
            ary.splice(j,1);
            j--;
        }
    }
  }
</script>
  • sort思想
<script>
ary.sort(function (a,b) {
    return a-b;
})
for(var i=0; i<ary.length; i++){
    if(ary[i]===ary[i+1]){
        ary.splice(i,1);
        i--; //为了预防数组塌陷
    }
}
</script>
  • 新数组
<script>
var newAry=[];
for(var i=0; i<ary.length; i++){
    if(newAry.indexOf(ary[i])===-1){
        newAry.push(ary[i]);
    }
}
</script>
  • 对象不重名
<script>
var obj={};
for(var i=0; i<ary.length; i++){
    var cur=ary[i];
    if(obj[cur]){//重复了
        ary.splice(i,1);
        i--;
    }else{
        obj[cur]=cur; //赋值;
    }
}
</script>
  • 对象不重名,记录次数
<script>
    var obj={};
    for(var i=0; i<ary.length; i++){
        var cur=ary[i];
        if(obj[cur]){
            obj[cur]++;
        }else{
            obj[cur]=1;
        }
    }
    var ary=[];
    for(var attr in obj){
        ary.push(Number(attr));
    }
</script>

算法

  • 快排
<script>
  var ary=[3,5,6,3,2,5,2,1];
  function quickSort(ary){
     if(ary.length <= 1){
      return ary;
    }
    var n = Math.floor(arr.length/2);
    var value = ary.splice(n,1)[0];
    var left=[],right=[];
    for(var i=0;i<ary.length;i++){
      var cur = ary[i];
       if(cur == ary[i]){
        left.push(ary[i]);
      }else{
        right.push(ary[i]);
      }
      return quickSort(left).concat([value],quickSort(right));
    }
  }
  var res = quickSort(ary);
</script>
  • 插排
<script>
  var ary= [25,16,3,1,3,7];
  function insertSort(ary){
    var left = ary.splice(0,1);
    for(var i=0;i<ary.length;i++){
       var cur = ary[i];
        for(var j<ary.length-1;j>=0;){
          if(cur < left[j]){
            j--;
            if(j == -1){
              left.unshift(cur);
              break;
            }
           }else{
            left.splice(j+1,0,cur);
            break;
          }
        }
    }
  }
</script>
  • 冒排
<script>
    var ary = [2,5,6,8,4,1,4];
     function bubbleSort(ary){
       for(var i=0;i<ary.length;i++){
          for(var j=0;j<ary.length-1-i;j++){
            if(ary[j] > ary[j+1]){
              var tmp = ary[j];
              ary[j] = ary[j+1];
              ary[j+1] = tmp;
            }
          }
        }
        return ary;
     }
    var res = bubblueSort()
 </script>

字符串常用方法

通过下标找字符串

  • charAt():通过下标找字符
  • charCodeAt():通过下标找相应字符的unicode编码

通过字符找下标

  • indexOf():从前往后找,找到返回相应的字符,找不到返回-1;
  • lastIndexOf():从后往前找,找到返回相应的字符,找不到返回-1;

字符串的截取和查找

  • slice(n,m)
  • subString(n,m)
    • slice 和 subString 都是从索引n找到索引m,包前不包后,但是slice支持负值,subString不支持负值
  • substr(n,m) 从索引n,截取m个

字符串转数组

  • split("切割形式")

字符串转大小写

  • toUpperCase() 小转大
  • toLowerCase() 大转小

字符串跟正则配合的方法

  • replace(要替换的字符/正则,替换成什么/cb的返回值)
  • search(查找的字符串 / 正则)
  • split(切割形式/正则)
  • math(字符串/正则) 可以把捕获到的内容,以数组的形式返回
    • 如果捕获到一个,返回的数组有三项: 1)item 2)index 3)input
    • 如果捕获到的一堆,把所有捕获到的内容,以数组的形式返回,主要用来配合正则
    • math捕获不到的时候,返回null

小题:把str = "zhongguo" 改成 "Zhongguo" 用字符串常用方法来实现

  • 思路1: str.slice(0,1).toUpperCase()+str.slice(1)
  • 思路2: str.charAt(0).toUpperCase()+str.slice(1)
  • 思路3: str=str.replace('z','Z');

i++ 和 ++i

  • i++ 先运算后++ 此处的++是本身的++ ,不参与运算
  • ++i 先++ 后运算 此处的++参与到运算中

定时器

  • 隔一段时间触发一次
    • setInterval()
    • clearInterval()
  • 时间到的时候执行一次
    • setTimeout()
    • clearTimeout()

日期对象

  • 定义一个日期对象 var oDate = new Date();
  • 获取现在距离 1970年1月1日 00:00:00的毫秒数 oDate = new getTime()
    • 格林尼治时间
  • oDate.getFullyear() 年
  • oDate.getMonth() + 1 获取月份一定要 + 1
  • oDate.getDate() 日
  • oDate.getDay() 星期
  • oDate.getHours() 小时
  • oDate.getMinutes() 分
  • oDate.getSeconds() 秒

实战

  • 时钟 日期对象+定时器
    • 注意:
      1)1位数要转成两位数
      2)页面一秒钟的空白处理
function toDou(n){
  return n>=0 && n<10 ? "0" + n : "" + n;
}
function clock(){
  var oDate = new Date();
  var y = oDate.getFullYear();
  var m = oDate.getMouth()+1;
  var d = oDate.getDate();
  var H = oDate.getHours();
  var M = oDate.getMinutes();
  var s = oDate.getSeconds();
  var str  = y+'-'+toDou(m)+'-'+toDou(d)+' '+toDou(H)+':'+toDou(M)+':'+toDou(S);
        document.body.innerHTML=str;
 }
  • 倒计时
    • 设置未来时间 new Date('2018/09/10 18:00:00')
    • 求毫秒差
      • new Date('2018/10/12 18:00:00')-new Date()
      • new Date('2018/10/12 18:00:00').getTime()-new Date().getTime()
    • 秒转换:把秒转成天,时,分,秒; 主要用到 % 的思想
    • 注意:当秒为负数的时候,需要做处理
<style>
    div{
        font-size: 30px;
    }
    div span{
        font-size: 50px;
        color: #ff0000;
    }
    div span.close{
        color: #cccccc;
    }
</style>
<div>距离下课还有  <span>00天 00 : 00 : 00</span></div>
<script>
    function toDou(n) {
        return n>=0 && n<10? '0'+n:''+n;
    }
    function countDown() {
       var oSpan=document.getElementsByTagName('span')[0];
        var timer=null; 
        var oDate=new Date();
       /* var s=Math.floor((new Date('2017/7/12 18:00:00').getTime() - oDate.getTime())/1000);*/
       var newDate=new Date('2017/7/12 17:21:30');
       var s=Math.floor((newDate-oDate)/1000);
        if(s<0){
            oSpan.innerHTML='你来晚了,我们已经下课了';
            oSpan.className='close';
            clearInterval(timer);
            return;
        }
        //24*60*60=86400 秒
        var d=Math.floor(s/86400);
        s%=86400;;
        var h=Math.floor(s/3600);
        s%=3600;
        var m=Math.floor(s/60);
        s%=60;
        oSpan.innerHTML=toDou(d)+'天 '+toDou(h)+' : '+toDou(m)+' : '+toDou(s); //字符串拼接
    }
    countDown();
    timer=setInterval(countDown,1000);
</script>

判断

  • if...else...
  • switch...case...
  • 三目 也叫做 三元表达式
    • 语法: 条件 ? 执行语句1 : 执行语句2 ;

数组如何转为字符串

  • ''+ num

请用setTimeout实现setInterval;比如 0 1 2 3 4 5关闭定时器;

// 111111
var i = 0;
var timer = null;
function callback(){
if(i > 5){
clearTimeout(timer);
return;
}
alert(i);
i++;
timer = setTimeout(callback,1000);
}
callback();

// 22222

var i = 0;
var timer = null;
function callback(){
timer = setTimeout(callback,1000);
if(i >= 5){
clearTimeout(timer);
}
alert(i);
i++;
}
callback();

// 333 --- 蕾蕾姐

var i = 0;
var timer = null
function fn(){
alert(i++);
if(i > 5){
clearTimeout(tiemr);
return;
}
timer = setTimeout(fn,1000);

}

#### 国外的星期1234560,请把这个变成中国的 一二三四五六日;请至少写出3种方法( '0123456'转成'日一二三四五六'

##### 核心思想:都是把数字星期作为索引

// 需求:'0123456'转成'日一二三四五六';
var str='0123456';
var ary=["日","一", "二", "三", "四", "五", "六"];
// 1111
str = str.repelace('0123456','日一二三四五六');

// 2222
str = str.split('').map(function(item,index,input){

return ary[index];
}).join('');

// 3333
str = ary.join('');

// 444
str = str.repelace(/\d/g,function(item,index,input){

return ary[item];
});



### 请把以前用数组展示的随机验证码,改成用字符串展示,并且,里面不能有不兼容的方法

<script>
var str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

//  用数组的方式

/* for循环验证码
function yanZhengMa(str){
var ary = [];
for(var i=0;i<4;i++){
var n = Math.floor(Math.random()*61);
if(ary.indexOf(str[n]) == -1){
ary.push(str[n]);
}else{
i--;
}
}
document.body.innerHTML = ary;
}
setInterval(function(){yanZhengMa(str)},1000);
/
/

function yZMW(str){
    var ary = [];
    while(ary.length < 4){
        var num = Math.round(Math.random()*61);
        if(ary.indexOf(str[num]) == -1){
            ary.push(str[num]);
        }
    }
    document.body.innerHTML = ary;
}
setInterval(function(){yZMW(str)},1000);

*/

//用字符串的方式
function strYZM(str) {
    var ary = '';
    while(ary.length < 4){
        var num = Math.round(Math.random()*61);
        if(ary.indexOf(str.charAt(num)) == -1){
            ary = ary + str.charAt(num);
        }
        document.body.innerHTML = ary;
    }
}

setInterval(function(){strYZM(str)},1000);

</script>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342