基礎(chǔ)JavaScript練習(xí)(二)

本篇主要目的是利用Javascript實(shí)現(xiàn)簡單的排序算法,因本人算法小白一個(gè),剛敲出來的東西比較粗糙又害怕會(huì)忘記,所以趁熱打鐵寫下這篇,后續(xù)會(huì)對(duì)代碼進(jìn)一步優(yōu)化同時(shí)摸索其他排序方法實(shí)現(xiàn)效果。

任務(wù)描述

  • 基于上一任務(wù)
  • 限制輸入的數(shù)字在10-100
  • 隊(duì)列元素?cái)?shù)量最多限制為60個(gè),當(dāng)超過60個(gè)時(shí),添加元素時(shí)alert出提示
  • 直接用高度表示數(shù)字大小
  • 實(shí)現(xiàn)一個(gè)簡單的排序功能

實(shí)現(xiàn)效果

before.png

after.png

子元素超過60個(gè)

解決思路

基于上一篇基礎(chǔ)JavaScript練習(xí)(一),具體需要解決的問題分為四部分。
1.修改正則表達(dá)式,限制輸入的數(shù)值區(qū)間為1-100;
2.增加判斷條件,如果content_box.childNodes.length==60,進(jìn)程無法繼續(xù)并彈出提示框;
3.點(diǎn)擊左側(cè)入/右側(cè)入按鈕添加元素時(shí),將用戶填寫的數(shù)值設(shè)置為該元素的高度;
4.實(shí)現(xiàn)排序的方法有很多(例:冒泡排序、快速排序、堆排序等),坦白說這里偷懶了,用了Javascript的內(nèi)置方法Aarry.prototype.sort();實(shí)際項(xiàng)目中如若遇到排序的問題,應(yīng)該首選此法。其他排序算法也是要學(xué)習(xí)的,后續(xù)會(huì)用其他方法實(shí)現(xiàn),把頭埋下去,現(xiàn)在正是你苦學(xué)的時(shí)候,時(shí)刻保持謙遜的心,這是身為程序員必須的品質(zhì)。已追加冒泡排序、選擇排序

排序代碼實(shí)現(xiàn)

//增加一個(gè)排序按鈕
 <input id="btn-sort" type="button" value="排序"> 
//獲取排序按鈕元素
var btn_sort=document.getElementById('btn-sort');
//監(jiān)聽排序按鈕并觸發(fā)事件
btn_sort.addEventListener("click", function(){
//新建數(shù)組newArray
                            var newArray=[];
//遍歷原始子元素?cái)?shù)組,將子元素中存儲(chǔ)的數(shù)值依次添加到newArray數(shù)組中,這里因?yàn)榧夹g(shù)不精無法直接獲取子元素中的數(shù)值數(shù)組,所以采用這種比較笨拙的方法
                            for(var i=0;i<content_box.childNodes.length;i++){
                                    newArray.push(content_box.childNodes[i].innerText);
                            }

//利用內(nèi)置排序方法sort()對(duì)newArray數(shù)組的數(shù)值進(jìn)行排序
                            newArray.sort(function(a,b){
                                return a-b;
                            })
//獲得排序后的數(shù)值,清空所有原有的子元素,遍歷newArray數(shù)組,重新創(chuàng)建li子元素,并以此將newArray的值設(shè)置為子元素的高度和innerText,最后添加到父元素content_box中
                            for (var x = 0; x < newArray.length; x++) {
                                content_box.removeChild(content_box.firstChild);
                                 var content_list=document.createElement("li");
                                content_list.style.height=newArray[x]+'px';
                                content_list.innerText=newArray[x];
                                content_box.appendChild(content_list);
                            }
                         }, false);

整體代碼實(shí)現(xiàn)

包含javascript內(nèi)置sort()排序方法、冒泡排序、選擇排序三種方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS基礎(chǔ)練習(xí)2</title>
    <style type="text/css">
    ul{margin: 0;padding: 0;display: flex;align-items: flex-end;}
    li{
        display: inline-block;
        width:20px;
        text-align: center;
        color: #fff;
        background-color: #cd4a48;
        margin-left: 2px;
        margin-top: 10px;
        font-size:0px;
    }
</style>
</head>
<body>
    <input id="text-box" type="text" value="">
        <input id="btn-left-to" type="button" value="左側(cè)入">
        <input id="btn-right-to" type="button" value="右側(cè)入">
        <input id="btn-left-out" type="button" value="左側(cè)出">
        <input id="btn-right-out" type="button" value="右側(cè)出">
        <input id="btn-sort" type="button" value="排序">
        <ul id="content-box"></ul>
        <script>
                window.onload=function(){
                    var text_box=document.getElementById("text-box"),
                        btn_left_to=document.getElementById("btn-left-to"),
                        btn_right_to=document.getElementById("btn-right-to"),
                        btn_left_out=document.getElementById("btn-left-out"),
                        btn_right_out=document.getElementById("btn-right-out"),
                        btn_sort=document.getElementById('btn-sort'),
                        content_box=document.getElementById("content-box");
                        //判斷,如果有值并且符合判斷條件,添加這條數(shù)據(jù)數(shù)據(jù)
                        function insert(dir){
                            var reg=/(^(?:[1-9]\d|100)$)/;
                            if(text_box.value==""){
                                alert("未輸入值");
                                text_box.focus();
                            }else if(isNaN(text_box.value)){
                                alert("您輸入的不是數(shù)字");
                                text_box.value="";
                                text_box.focus();
                            }else if(content_box.childNodes.length==60){
                                alert("最多只能添加60個(gè)值,已無法增加");
                            }else if(reg.test(text_box.value)){
                                var content_list=document.createElement("li");
                                content_list.innerText=text_box.value;
                                content_list.style.height=text_box.value+'px';
                                if (dir==="left") {
                                    content_box.insertBefore(content_list,content_box.childNodes[0]);
                                    text_box.value="";
                                    text_box.focus();
                                }else if(dir==="right"){
                                    content_box.appendChild(content_list);
                                    text_box.value="";
                                    text_box.focus();
                                }  
                            }else{
                                    alert("請(qǐng)輸入10-100之間的數(shù)字");
                                    text_box.value="";
                                    text_box.focus();
                            
                            }
                        }
                        //刪除數(shù)據(jù)
                        function del(dir){
                            if (content_box.childNodes.length<=0) {
                                alert("沒有可以刪除的元素");
                                return false;
                            }else if (dir==="left") {
                                alert("刪除數(shù)字:"+content_box.firstChild.innerText);
                                content_box.removeChild(content_box.firstChild);
                                text_box.value="";
                            }else if(dir==="right"){
                                alert("刪除數(shù)字:"+content_box.lastChild.innerText);
                                content_box.removeChild(content_box.lastChild);
                                text_box.value="";
                            }else{
                                content_box.removeChild(event.target);
                            }
                        }
                   //       function bubbleSort(arr) {
                            //     var len = arr.length;
                            //     for (var i = 0; i < len; i++) {
                            //         for (var j = 0; j < len - 1 - i; j++) {
                            //             if (arr[j] > arr[j+1]) {        //相鄰元素兩兩對(duì)比
                            //                 var temp = arr[j+1];        //元素交換
                            //                 arr[j+1] = arr[j];
                            //                 arr[j] = temp;
                            //             }
                            //         }
                            //     }
                            //     return arr;
                            // }
                            //選擇排序
                            function selectionSort(arr) {
                            var len = arr.length;
                            var minIndex, temp;
                            for (var i = 0; i < len - 1; i++) {
                                minIndex = i;
                                for (var j = i + 1; j < len; j++) {
                                    if (arr[j] < arr[minIndex]) {     //尋找最小的數(shù)
                                        minIndex = j;                 //將最小數(shù)的索引保存
                                    }
                                }
                                temp = arr[i];
                                arr[i] = arr[minIndex];
                                arr[minIndex] = temp;
                            }
                            return arr;
                        }
                        btn_left_to.addEventListener("click", function(){insert("left")}, false);
                        btn_right_to.addEventListener("click", function(){insert("right")}, false);
                        btn_left_out.addEventListener("click", function(){del("left")}, false);
                        btn_right_out.addEventListener("click", function(){del("right")}, false);
                         btn_sort.addEventListener("click", function(){
                            var newArray=[];
                            for(var i=0;i<content_box.childNodes.length;i++){
                                    newArray.push(content_box.childNodes[i].innerText);
                            }
                            // 方法一:Javascript內(nèi)置方法Array.prototype.sort();
                            // newArray.sort(function(a,b){
                            //  return a-b;
                            // })
                            //冒泡排序
                            // bubbleSort(newArray);
                            // 選擇排序
                            selectionSort(newArray);
                            for (var x = 0; x < newArray.length; x++) {
                                content_box.removeChild(content_box.firstChild);
                                 var content_list=document.createElement("li");
                                content_list.style.height=newArray[x]+'px';
                                content_list.innerText=newArray[x];
                                content_box.appendChild(content_list);
                            }
                         }, false);
                        content_box.addEventListener('click',function(e){
                        if(e.target.nodeName.toLowerCase() == 'li'){
                            content_box.removeChild(e.target);
                        }
                    });
                }
        </script>
</body>
</html>

通過該任務(wù)學(xué)到的新知識(shí)

1. Array.prototype.sort()

sort() 方法在適當(dāng)?shù)奈恢脤?duì)數(shù)組的元素進(jìn)行排序,并返回?cái)?shù)組。詳細(xì)可查

2. HTML DOM querySelector() 方法

querySelector() 方法返回文檔中匹配指定 CSS 選擇器的一個(gè)元素。

3. 如何刪除父元素下的所有子元素

沒有找到直接可以刪除的方法,我采用的方法是依次刪除父元素第一個(gè)子元素。
content_box.removeChild(content_box.firstChild);

心得感悟

程序之路且走且珍惜,感謝大春哥,循循善誘,用心良苦。

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 任務(wù)描述 基于上一任務(wù)限制輸入的數(shù)字在10-100隊(duì)列元素?cái)?shù)量最多限制為60個(gè),當(dāng)超過60個(gè)時(shí),添加元素時(shí)aler...
    海藻web開發(fā)閱讀 223評(píng)論 0 0
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,154評(píng)論 1 92
  • 某次二面時(shí),面試官問起Js排序問題,吾絞盡腦汁回答了幾種,深感算法有很大的問題,所以總計(jì)一下! 排序算法說明 (1...
    流浪的先知閱讀 1,252評(píng)論 0 4
  • 當(dāng)我獨(dú)行時(shí),似乎世界都投來意味深長的目光。 究其因,不過都是透過他人看自己罷了! 我們應(yīng)該...
    抒意Y閱讀 417評(píng)論 0 0
  • 01 緊閉的臥室房門里,姚大偉正在和妻子陳惠香談判:“小嬌要去旅游的事兒,我不是跟你說了嗎?” “你是說了,但你沒...
    奇奇漫悅讀閱讀 2,165評(píng)論 23 20

友情鏈接更多精彩內(nèi)容