1. 程式人生 > >javascript array js 快取演算法,陣列去重、陣列隨機抽取、字母串轉數字,數字轉字串

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高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!