javascript array js 緩存算法,數組去重、數組隨機抽取、字母串轉數字,數字轉字符串

前言

  • 因爲平時在寫代碼的過程中,有些算法會經常重複寫,比如數組去重、數組抽取隨機值等!雖然這些不是很難的邏輯,但是每次剛開始遇到需求的時候,還是需要琢磨一些時間才能想出來,所以此文檔把這些常見算法的思想記錄下來,以便下次再遇到的時候不會手腳無措了!

  • 這篇文檔不考慮es6等語法,也不考慮Array自帶的一些過濾方法!

數組去重

  • 我們這裏不考慮數組上的一個自帶的過濾算法,比如map、filter等方法!數組去重的關鍵是需要一箇中間數組來存數組來幫助實現數組去重!

  • 方法一:

    var arr = [1,2,3,1,1,1,1];
    function toHeavy(array){
        //這是一個緩存對象,用來實現過濾到重複的數據
        var cache = {};
        //定義一箇中間數組,用來實現當容器
        var cacheArr = [];
        for(var i = 0,len = array.length;i<len;i++){
            if(!cache[array[i]]){
                cacheArr.push(array[i]);
                cache[array[i]] = array[i];
            };
        };
        return cacheArr;
    };
    arr = toHeavy(arr);//arr ==  [1,2,3]
  • 方法二:
    //其實思想跟第一個差不多
    var arr = [1,2,3,1,1,1,1,1,1];
    function toHeavy(array){
        var cache = [];
        for(var i = 0,len = array.length;i<len;i++){
            //用閉包,防止isHeavy向外部暴露,當然如果用es6的話,可以用let對isHeavy進行聲明也能達到同樣的目的
            //因爲js中沒有塊級作用域
            (function(){
                var isHeavy = false;
                for(var j = 0,_len = cache.length;j<_len;j++){
                    if(cache[j] == array[i]){
                        isHeavy = true;
                        break;
                    };
                };
                if(!isHeavy){
                    //如果不是重複的,那麼就執行把當前值推送的cache裏面
                    cache.push(array[i]);
                };
            })();
        };
        return cache;
    };

    arr = toHeavy(arr);

最後說一句,現實中的數據肯定不會這麼簡單,可能會是一個稍微複雜的數據,要給這些數組去重你也不要被嚇住,其實原理是一樣的,只是你被迷惑了而已!

在一個數組中隨機抽取一部分值

  • 這個算法的關鍵要使用Math.random,不說了直接上代碼:
    var arr = ['小明','小紅','小陳','小於','小蘭','小法','小p','小張','小鎮','小王','傻逼','慫逼'];

    function getArr(num,array){
        //num表示要去多少個,它不能大於要取的那個數組的最大長度,如果超過了那麼就等於它的長度
        var aLength = array.length;
        if(num>=aLength){
            num = aLength;
        };
        var cacheArr = [];
        //我們用一個數組保存原來的數組
        //記住千萬能直接賦值,因爲數組是一個引用,這樣不能保持原來的數組
        //這裏也可以用originArr = array.slice()
        var originArr = (function(){
            var arr = [];
            for(var i = 0,len = array.length;i<len;i++){
                arr.push(array[i]);
            };
            return arr;
        })();
        for(var i = 0;i<num;i++){
            //array.length不能寫成上面的aLength,因爲aLength是固定的值,而array.length隨着array的改變是自動更新的
            //Math.random() * array.length得到的是一個介於長度和零之間的一個值,包括0但不包含長度值
            //我們算出的是一個浮點值,所以我們必須把它轉化成整數
            //因爲不能超過最大長度值,所以應該向下取整
            var _index = Math.floor(Math.random() * array.length);
            cacheArr.push(array[_index]);
            //記住一定,取出來之後,一定刪除原來位置上的數組值
            //要不然數組更新不了
            array.splice(_index,1);
        };
        //取回原來的數組
        array = originArr;
        console.log(array);
        return cacheArr;
    };
    var brr = getArr(5,arr);

得到某個區間的字母組成的數組

  • 這裏主要應用兩個方法,一個字符串的charCodeAt和String上的一個靜態方法fromCharCode。其思想主要是:先得到這個區間開頭字母和結束字母的數字表示,然後就可以在這個區間內做一個循環,並且得到這個區間字母的數字表示,最後把數字傳喚成字母依次push到數組裏面返回。直接上代碼:
    function getArrForAlphabet(startLetter,endLetter){
        //var regExp = /^[a-zA-Z]$/gi;
        var regExp = new RegExp("^[a-zA-Z]$");
        if(!regExp.test(startLetter) || !regExp.test(endLetter)){
            //console.log(regExp.test(startLetter));
            //console.log(regExp.test(endLetter));
            console.log('請傳入字母!');
            return false;
        };
        //i是得到開始字母的數字表示,j得到結束字母的數字表示
        var i = startLetter.charCodeAt(0),j = endLetter.charCodeAt(0);
        //定義一個數組用於取出將來的字母
        var arr = [];
        //這裏取<=符號是因爲要取出結束的字母
        for(;i<=j;i++){ 
            //fromCharCode是String上的一個靜態方法,用於將一個數字轉換成對應的字母
            var letter = String.fromCharCode(i);
            arr.push(letter);
        };
        //記得最後返回arr
        return arr;
    };

 

加Java架構師進階交流羣獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。
性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 
都是大牛帶飛 讓你少走很多的彎路的 羣號是:  558787436 對了 小白勿進 最好是有開發經驗 

注:加羣要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶着大家全面、科學地建立自己的技術體系和技術認知!
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章