JS-NO.4

2017-07-12  本文已影响0人  _阳光很暖_

数组方法

Math常用方法

算法

快排

var ary=[12,2,26,3,1,19,8];
    function quickSort(ary) {
        //5:停止拆分的条件;
        if(ary.length<=1){
            return ary;//return后面的语句都不会执行;
            //return有阻断程序执行的作用;
        }
        //1:先找出中间一项,向下取整
        var centerIndex=Math.floor(ary.length/2);
        //2:通过中间索引,拿到该索引对应的值;
        var centerValue=ary.splice(centerIndex,1)[0];
        //3:创建两个新的空数组,left和right
        var left=[],
            right=[];
        //4:用ary中的每一项跟centerValue比较,比他小的放left数组,比他大的放right数组;
        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中取出来一个数字,单独成为数组 使用splice方法
2、遍历ary的数组,跟left数组,从后往前的比较,如果比left的数字小,继续往前比,如果比某个值大,就插入到这个值的下一项的前面;重点(必须break,否则就会出错) ;如果比所有的都小,那就插入到left数组的第一个;

var ary=[23,21,12,6,1,32,8];
    /*
    * 1:从ary数组中,随意抽取一张牌,放入left数组;比如:[23]
    * 2:遍历ary中的每一个,用其跟left数组进行比对,如果比left的某个值小,继续往前比对,如果比到头还小的话,插入left数组的第一项,unshift;
    * 如果比left数组中的某个值大,插入到这个值的下一项的前面;一定阻断程序的执行;
    * */
    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]){//如果当前项,比left的最后一个小的话,继续往前比,j--
                    j--;
                    if(j==-1){//代表比到头,还小的话,就插入到left的第一个位置;
                        left.unshift(cur);
                    }
                }else{
                    left.splice(j+1,0,cur);
                    break; //break跳出循环
                }
            }
        }
        return left;

    }
var res=insertSort(ary);

冒排

1、两重循环,第一重循环代表的是轮数,第二重循环代表的次数,比较的次数在一次次的减少;
2、 每次比较的时候,都拿当前项跟后一项进行比较,如果比他大,交换位置;

var ary=[23,21,12,6,1,32,8];
    /*
    *第一轮 最多可以比6次 已经把最大值放在最后了
         * [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次 已经把最大的三个值放在后面
        * [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次 已经最大的四个值放在侯民啊
        *[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次;
    *
    * */

    //外面的循环应该是比较的"轮数"
    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;
            }
        }
    }

数组去重的思路:

1、 双重循环
2、 先sort,然后用当前项跟相邻项进行比较
3、 新数组
4、 利用不重名的特性
5、 利用对象不重名的特性,实现了重复次数的记录,里面用到两个循环,一个for循环,for..in循环

思路1:双重循环

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]){
                //删除数组中间项,只能用splice;
                ary.splice(j,1);
                j--;//为了防止数组塌陷
            }
        }
    }

思路2:创建新数组

var newAry=[];
    for(var i=0; i<ary.length; i++){
        //如何判断新数组中是否有某个值 indexOf
        if(newAry.indexOf(ary[i])==-1){//如果新数组中没有的话
            newAry.push(ary[i]);//把这个数放入新数组
        }
    }

思路3:sort排序

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--;//防止数组塌陷
        }
    }

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

var obj={};
    //遍历数组中的每一项,如果对象中没有,把这一项赋值一份给对象,如果对像中已经有了,说明这是重复项,我们就删除数组中的这一项;
    for(var i=0; i<ary.length; i++){
        if(obj[ary[i]]){//走if说明重复了;
            ary.splice(i,1);
            i--;
        }else{//走else说明对象中没有这个数;那么就给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++){
        //取随机数
        var num=Math.round(Math.random()*61);
        if(ary.indexOf(strCode[num])==-1){//说明数组中没有你;
            ary.push(strCode[num]);
        }else{//证明数组中已经存在,为了不浪费这次机会,我们必须i--;
            i--;//这次不算,以后冲抓
        }
    }
    document.write(ary)

验证码2

while(ary.length<4){//只要数组的长度小于4,都可以无限制的抓下去
        var num=Math.round(Math.random()*61);
        if(ary.indexOf(strCode[num])==-1){//只有不重复,才往数组中放;
            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">内容1</div>
    <div>内容2</div>
    <div>内容3</div>
</div>
<div class="wrap" id="tab2">
    <ul>
        <li class="on">按钮1</li>
        <li>按钮2</li>
    </ul>
    <div class="show">内容1</div>
    <div>内容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">内容1</div>
    <div>内容2</div>
    <div>内容3</div>
    <div>内容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';
        //思路:点击每个按钮的时候,让所有的按钮都变灭,就让当前按钮点亮,让所有的内容框都隐藏,就让当前按钮对应的内容框显示;
        //事件属于异步,异步就会有时间差,所以,外面循环中的i值等到事件触发的时候,早都已经循环结束,我们只能拿到最大的i值;而这个i值一定是错误的;
        //解决方式有两种:1)自定义属性 2)闭包
        //设置默认的 点亮项
        selectIndex=selectIndex%aBtn.length||0;//传了按照传的来,没穿默认设置索引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">内容1</div>
    <div>内容2</div>
    <div>内容3</div>
</div>
<div class="wrap" id="tab2">
    <ul>
        <li class="on">按钮1</li>
        <li>按钮2</li>
    </ul>
    <div class="show">内容1</div>
    <div>内容2</div>
</div>
<script>
    function tab(id,selectIndex) {
        //1:获取需要的元素:需要所有的按钮+所有的内容框;一定要限制范围的获取元素;
        var oWrap=document.getElementById(id);
        var aBtn=oWrap.getElementsByTagName('li');
        var aDiv=oWrap.getElementsByTagName('div');
        //动态计算wrap容器的宽度
        oWrap.style.width=aBtn.length*200+'px';
        //在点击事件触发前,就要设置默认选中项;
        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;  //对象的设置;我们设置了自定义属性index,对应的值分别是0,1,2
             //当元素身上的事件被触发的时候,会执行一个函数,函数中的this指向当前这个元素;
             aBtn[i].onclick=function () {
             //3:点击事件发生的时候,想做什么事?
                 select(this.index)
             }
        }
    }
    tab('tab1',1);
    tab('tab2');
</script>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读