JS-NO.4

數(shù)組方法

  • 從數(shù)組末尾刪除一項,有哪些方法鳍征?
    • ary.length--
    • ary.length-=1; ary.length=ary.lengty-1;
    • ary.pop()
    • ary.splice(ary.length-1,1)
  • 給數(shù)組末尾增加一項
    • ary[ary.length]=xxx;
    • ary.push()
    • ary.splice(ary.length,'xxx')
  • 數(shù)組的克隆
    • slice()/ slice(0)
    • ary.concat();
    • ary.splice(0)

Math常用方法

  • Math.ceil() 向上取整
  • Math.floor() 向下取整
  • Math.random() 取0~1之間的隨機小數(shù)黍翎,不包含1;
    • Math.round(Math.random()*(m-n)+n); 取n~m之間的隨機整數(shù)蟆技,包含m
  • Math.round() 四舍五入
  • Math.pow(2,3) 冪次方
  • Math.sqrt() 開平方
  • Math.abs() 取絕對值

算法

快排

  • 1:先拿到中間的索引玩敏,通過中間索引找到他對應(yīng)的項
    • 這個中間項,是從數(shù)組中拎出來质礼,即數(shù)組中沒有他了旺聚,所以,只能用splice眶蕉;
    • splice的返回值砰粹,是被刪除的內(nèi)容以新數(shù)組的形式返回,因為我們刪除了一項造挽,所以碱璃,要取數(shù)字必須用方括號 [0];
  • 2:創(chuàng)建兩個新數(shù)組left=[],right=[]饭入;
  • 3:用ary數(shù)組中每一項跟中間項比較嵌器,比他小的放left數(shù)組,比他大的放right數(shù)組
  • 4: return quciksort(left).concat([center],quciksort(right));
    • 函數(shù)自己調(diào)用自己谐丢,屬于"遞歸"
  • 5:停止拆分的條件 if(ary.length<=1){return ary;}
    • return 1)有阻斷程序執(zhí)行的功能 2)返回值爽航;
var ary=[12,2,26,3,1,19,8];
    function quickSort(ary) {
        //5:停止拆分的條件蚓让;
        if(ary.length<=1){
            return ary;//return后面的語句都不會執(zhí)行;
            //return有阻斷程序執(zhí)行的作用讥珍;
        }
        //1:先找出中間一項历极,向下取整
        var centerIndex=Math.floor(ary.length/2);
        //2:通過中間索引,拿到該索引對應(yīng)的值衷佃;
        var centerValue=ary.splice(centerIndex,1)[0];
        //3:創(chuàng)建兩個新的空數(shù)組趟卸,left和right
        var left=[],
            right=[];
        //4:用ary中的每一項跟centerValue比較,比他小的放left數(shù)組氏义,比他大的放right數(shù)組锄列;
        for(var i=0; i<ary.length; i++){
            var cur=ary[i];
            if(cur<centerValue){
                left.push(cur)
            }else{
                right.push(cur);
            }
        }
        return quickSort(left).concat([centerValue],quickSort(right));
    }
    var res=quickSort(ary);

插排

1、先從ary中取出來一個數(shù)字觅赊,單獨成為數(shù)組 使用splice方法
2右蕊、遍歷ary的數(shù)組,跟left數(shù)組吮螺,從后往前的比較饶囚,如果比left的數(shù)字小,繼續(xù)往前比鸠补,如果比某個值大淫僻,就插入到這個值的下一項的前面斥杜;重點(必須break,否則就會出錯) ;如果比所有的都小痛单,那就插入到left數(shù)組的第一個德撬;

var ary=[23,21,12,6,1,32,8];
    /*
    * 1:從ary數(shù)組中银酬,隨意抽取一張牌末贾,放入left數(shù)組;比如:[23]
    * 2:遍歷ary中的每一個,用其跟left數(shù)組進行比對勋陪,如果比left的某個值小贪磺,繼續(xù)往前比對,如果比到頭還小的話诅愚,插入left數(shù)組的第一項寒锚,unshift;
    * 如果比left數(shù)組中的某個值大违孝,插入到這個值的下一項的前面刹前;一定阻斷程序的執(zhí)行;
    * */
    function insertSort(ary){
        var left=ary.splice(0,1);  //[23]
        //遍歷ary雌桑,用ary中的每一個喇喉,跟left從后往前的比較;
        for(var i=0; i<ary.length; i++){
            var cur=ary[i];
            //跟left從后往前的比較
            for(var j=left.length-1; j>=0;){
                if(cur<left[j]){//如果當(dāng)前項校坑,比left的最后一個小的話轧飞,繼續(xù)往前比衅鹿,j--
                    j--;
                    if(j==-1){//代表比到頭撒踪,還小的話过咬,就插入到left的第一個位置;
                        left.unshift(cur);
                    }
                }else{
                    left.splice(j+1,0,cur);
                    break; //break跳出循環(huán)
                }
            }
        }
        return left;

    }
var res=insertSort(ary);

冒排

1制妄、兩重循環(huán)掸绞,第一重循環(huán)代表的是輪數(shù),第二重循環(huán)代表的次數(shù)耕捞,比較的次數(shù)在一次次的減少衔掸;
2、 每次比較的時候俺抽,都拿當(dāng)前項跟后一項進行比較敞映,如果比他大,交換位置磷斧;

var ary=[23,21,12,6,1,32,8];
    /*
    *第一輪 最多可以比6次 已經(jīng)把最大值放在最后了
         * [21,23,12,6,1,32,8]
         * [21,12,23,6,1,32,8]
         * [21,12,6,23,1,32,8]
         * [21,12,6,1,23,32,8]
         * [21,12,6,1,23,32,8]
         * [21,12,6,1,23,8,32]
    *第二輪 最多可以比5次振愿, 可以把次大值和最大值,放在后面
        * [12,21,6,1,23,8,32]
        * [12,6,21,1,23,8,32]
        * [12,6,1,21,23,8,32]
        * [12,6,1,21,23,8,32]
        * [12,6,1,21,8,23,32]
    *第三輪 最多可以比4次 已經(jīng)把最大的三個值放在后面
        * [6,12,1,21,8,23,32]
        * [6,1,12,21,8,23,32]
        * [6,1,12,21,8,23,32]
        * [6,1,12,8,21,23,32]
    *第四輪 最多可以比3次 已經(jīng)最大的四個值放在侯民啊
        *[1,6,12,8,21,23,32]
        *[1,6,12,8,21,23,32]
        *[1,6,8,12,21,23,32]
    *第五輪  最多可以比2次
    * [1,6,8,12,21,23,32]
    * 第六輪 最多可以1次弛饭;
    * 第七輪 最多可以比0次冕末;
    *
    * */

    //外面的循環(huán)應(yīng)該是比較的"輪數(shù)"
    for(var i=0; i<ary.length; i++){
        //里面比較的是次數(shù)
        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;
            }
        }
    }

數(shù)組去重的思路:

1、 雙重循環(huán)
2侣颂、 先sort档桃,然后用當(dāng)前項跟相鄰項進行比較
3、 新數(shù)組
4憔晒、 利用不重名的特性
5藻肄、 利用對象不重名的特性,實現(xiàn)了重復(fù)次數(shù)的記錄拒担,里面用到兩個循環(huán)嘹屯,一個for循環(huán),for..in循環(huán)

思路1:雙重循環(huán)

for(var i=0; i<ary.length; i++){
        var cur=ary[i];
        //要跟后面每一項進行比對
        for(var j=i+1; j<ary.length; j++){
            if(cur==ary[j]){
                //刪除數(shù)組中間項澎蛛,只能用splice抚垄;
                ary.splice(j,1);
                j--;//為了防止數(shù)組塌陷
            }
        }
    }

思路2:創(chuàng)建新數(shù)組

var newAry=[];
    for(var i=0; i<ary.length; i++){
        //如何判斷新數(shù)組中是否有某個值 indexOf
        if(newAry.indexOf(ary[i])==-1){//如果新數(shù)組中沒有的話
            newAry.push(ary[i]);//把這個數(shù)放入新數(shù)組
        }
    }

思路3:sort排序

ary.sort(function (a,b) {
        return a-b;
    });
    //用當(dāng)前項跟他的鄰居比對,如果重復(fù)谋逻,刪掉其中一個就行呆馁;
    for(var i=0; i<ary.length; i++){
        if(ary[i]===ary[i+1]){
            ary.splice(i,1);
            i--;//防止數(shù)組塌陷
        }
    }

思路4:利用對象不重名的特性

var obj={};
    //遍歷數(shù)組中的每一項,如果對象中沒有毁兆,把這一項賦值一份給對象浙滤,如果對像中已經(jīng)有了,說明這是重復(fù)項气堕,我們就刪除數(shù)組中的這一項纺腊;
    for(var i=0; i<ary.length; i++){
        if(obj[ary[i]]){//走if說明重復(fù)了畔咧;
            ary.splice(i,1);
            i--;
        }else{//走else說明對象中沒有這個數(shù);那么就給obj添加屬性
            obj[ary[i]]=ary[i];
        }
    }

思路5:利用對象

var obj={};
    for(var i=0; i<ary.length; i++){
        if(obj[ary[i]]){
            obj[ary[i]]++; //++ +=1
        }else{//走else一定是對象沒有揖膜;給這個屬性名貼個1的標簽
            obj[ary[i]]=1;
        }
    }
    //通過for..in拿到每個屬性名誓沸;
    var newAry=[];
    for(var attr in obj){
        newAry.push(Number(attr));
    }

驗證碼1

var strCode='abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789';
    var ary=[];
for(var i=0; i<4; i++){
        //取隨機數(shù)
        var num=Math.round(Math.random()*61);
        if(ary.indexOf(strCode[num])==-1){//說明數(shù)組中沒有你;
            ary.push(strCode[num]);
        }else{//證明數(shù)組中已經(jīng)存在壹粟,為了不浪費這次機會拜隧,我們必須i--;
            i--;//這次不算,以后沖抓
        }
    }
    document.write(ary)

驗證碼2

while(ary.length<4){//只要數(shù)組的長度小于4趁仙,都可以無限制的抓下去
        var num=Math.round(Math.random()*61);
        if(ary.indexOf(strCode[num])==-1){//只有不重復(fù)洪添,才往數(shù)組中放;
            ary.push(strCode[num])
        }
    }
    document.write(ary)

選項卡 閉包

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        *{
            margin: 0;
            padding: 0;
            list-style: none;
        }
        .wrap{
            height: 300px;
            float: left;
            margin: 10px;
        }
        .wrap li{
            width: 200px;
            height: 50px;
            line-height: 50px;
            text-align: center;
            float: left;
            background: #cccccc;
            border-bottom:1px solid #333;
            box-sizing: border-box;
        }
        .wrap li+li{
            border-left:1px solid #333;
        }
        .wrap li.on{
            background: #ADD8E6;
            border-bottom: none;
        }
        .wrap div{
            height: 100%;
            display: none;
            background: #add8e6;
        }
        .wrap div.show{
            display: block;
        }
    </style>
</head>
<body>
<div class="wrap" id="tab1">
    <ul>
        <li class="on">按鈕1</li>
        <li>按鈕2</li>
        <li>按鈕3</li>
    </ul>
    <div class="show">內(nèi)容1</div>
    <div>內(nèi)容2</div>
    <div>內(nèi)容3</div>
</div>
<div class="wrap" id="tab2">
    <ul>
        <li class="on">按鈕1</li>
        <li>按鈕2</li>
    </ul>
    <div class="show">內(nèi)容1</div>
    <div>內(nèi)容2</div>
</div>
<div class="wrap" id="tab3">
    <ul>
        <li class="on">按鈕1</li>
        <li>按鈕2</li>
        <li>按鈕3</li>
        <li>按鈕4</li>
    </ul>
    <div class="show">內(nèi)容1</div>
    <div>內(nèi)容2</div>
    <div>內(nèi)容3</div>
    <div>內(nèi)容4</div>
</div>
<script>
    function tab(id,selectIndex) {
        //必須限定范圍的獲取元素
        var oWrap=document.getElementById(id);
        var aBtn=oWrap.getElementsByTagName('li');
        var aDiv=oWrap.getElementsByTagName('div');
        oWrap.style.width=aBtn.length*200+'px';
        //思路:點擊每個按鈕的時候雀费,讓所有的按鈕都變滅干奢,就讓當(dāng)前按鈕點亮,讓所有的內(nèi)容框都隱藏盏袄,就讓當(dāng)前按鈕對應(yīng)的內(nèi)容框顯示忿峻;
        //事件屬于異步,異步就會有時間差貌矿,所以炭菌,外面循環(huán)中的i值等到事件觸發(fā)的時候,早都已經(jīng)循環(huán)結(jié)束逛漫,我們只能拿到最大的i值黑低;而這個i值一定是錯誤的;
        //解決方式有兩種:1)自定義屬性 2)閉包
        //設(shè)置默認的 點亮項
        selectIndex=selectIndex%aBtn.length||0;//傳了按照傳的來酌毡,沒穿默認設(shè)置索引0;
        function show(showIndex) {
            for(var i=0; i<aBtn.length; i++){
                aBtn[i].className=null;
                aDiv[i].className=null;
            }
            aBtn[showIndex].className='on';
            aDiv[showIndex].className='show';
        }
        show(selectIndex)
        for(var i=0; i<aBtn.length; i++){
            (function (index) {
                aBtn[index].onclick=function () {
                    show(index)
                }
            })(i);
        }

    }
    tab('tab1')
    tab('tab2',1)
    tab('tab3',103)
</script>
</body>
</html>

選項卡 自定義屬性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圓夢源:勿忘初心克握,方得始終</title>
    <style>
        *{
            padding: 0;
            margin: 0;
            list-style: none;
        }
        .wrap{
            width: 600px;
            height: 300px;
            float: left;
            margin: 10px;
        }
        .wrap li{
            width: 200px;
            height: 50px;
            line-height: 50px;
            background: #cccccc;
            text-align: center;
            float: left;
            border-bottom:1px solid #333;
            box-sizing: border-box;
        }
        .wrap li.on{
            border-bottom: none;
            background: #ADD8E6;
        }
        .wrap li+li{
            border-left:1px solid #333;
        }
        .wrap div{
            height: 100%;
            background: #add8e6;
            display: none;
            text-align: left;
        }
        .wrap div.show{
            display: block;
        }
    </style>
</head>
<body>
<div class="wrap" id="tab1">
    <ul>
        <li class="on">按鈕1</li>
        <li>按鈕2</li>
        <li>按鈕3</li>
    </ul>
    <div class="show">內(nèi)容1</div>
    <div>內(nèi)容2</div>
    <div>內(nèi)容3</div>
</div>
<div class="wrap" id="tab2">
    <ul>
        <li class="on">按鈕1</li>
        <li>按鈕2</li>
    </ul>
    <div class="show">內(nèi)容1</div>
    <div>內(nèi)容2</div>
</div>
<script>
    function tab(id,selectIndex) {
        //1:獲取需要的元素:需要所有的按鈕+所有的內(nèi)容框;一定要限制范圍的獲取元素;
        var oWrap=document.getElementById(id);
        var aBtn=oWrap.getElementsByTagName('li');
        var aDiv=oWrap.getElementsByTagName('div');
        //動態(tài)計算wrap容器的寬度
        oWrap.style.width=aBtn.length*200+'px';
        //在點擊事件觸發(fā)前枷踏,就要設(shè)置默認選中項菩暗;
        selectIndex=selectIndex%aBtn.length||0;
        function select(showIndex) {
            for(var i=0; i<aBtn.length; i++){
                aBtn[i].className='';
                aDiv[i].className='';
            }
            aBtn[showIndex].className='on';
            aDiv[showIndex].className='show';
        }
        select(selectIndex);
        //2:給每個元素添加事件
        for(var i=0; i<aBtn.length; i++){
            //思路1:自定義屬性
             aBtn[i].index=i;  //對象的設(shè)置;我們設(shè)置了自定義屬性index旭蠕,對應(yīng)的值分別是0停团,1,2
             //當(dāng)元素身上的事件被觸發(fā)的時候掏熬,會執(zhí)行一個函數(shù)佑稠,函數(shù)中的this指向當(dāng)前這個元素;
             aBtn[i].onclick=function () {
             //3:點擊事件發(fā)生的時候旗芬,想做什么事舌胶?
                 select(this.index)
             }
        }
    }
    tab('tab1',1);
    tab('tab2');
</script>
</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疮丛,隨后出現(xiàn)的幾起案子幔嫂,更是在濱河造成了極大的恐慌辆它,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件履恩,死亡現(xiàn)場離奇詭異锰茉,居然都是意外死亡,警方通過查閱死者的電腦和手機似袁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門洞辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昙衅,你說我怎么就攤上這事《瘢” “怎么了而涉?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長联予。 經(jīng)常有香客問我啼县,道長,這世上最難降的妖魔是什么沸久? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任季眷,我火速辦了婚禮,結(jié)果婚禮上卷胯,老公的妹妹穿的比我還像新娘子刮。我一直安慰自己,他們只是感情好窑睁,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布挺峡。 她就那樣靜靜地躺著,像睡著了一般担钮。 火紅的嫁衣襯著肌膚如雪橱赠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天箫津,我揣著相機與錄音狭姨,去河邊找鬼。 笑死苏遥,一個胖子當(dāng)著我的面吹牛饼拍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暖眼,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惕耕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诫肠?” 一聲冷哼從身側(cè)響起司澎,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤欺缘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挤安,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谚殊,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年蛤铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫩絮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡围肥,死狀恐怖剿干,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穆刻,我是刑警寧澤置尔,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站氢伟,受9級特大地震影響榜轿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朵锣,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一谬盐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诚些,春花似錦飞傀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椅您,卻和暖如春外冀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掀泳。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工雪隧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人员舵。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓脑沿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親马僻。 傳聞我的和親對象是個殘疾皇子庄拇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容