javascript array js 緩存算法,數(shù)組去重、數(shù)組隨機(jī)抽取、字母串轉(zhuǎn)數(shù)字,數(shù)字轉(zhuǎn)字符串

前言


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

數(shù)組去重

  • 我們這里不考慮數(shù)組上的一個自帶的過濾算法,比如map、filter等方法!數(shù)組去重的關(guān)鍵是需要一個中間數(shù)組來存數(shù)組來幫助實(shí)現(xiàn)數(shù)組去重!
  • 方法一:
    var arr = [1,2,3,1,1,1,1];
    function toHeavy(array){
        //這是一個緩存對象,用來實(shí)現(xiàn)過濾到重復(fù)的數(shù)據(jù)
        var cache = {};
        //定義一個中間數(shù)組,用來實(shí)現(xiàn)當(dāng)容器
        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]
  • 方法二:
    //其實(shí)思想跟第一個差不多
    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向外部暴露
            //因?yàn)閖s中沒有塊級作用域
            (function(){
                var isHeavy = false;
                for(var j = 0,_len = cache.length;j<_len;j++){
                    if(cache[j] == array[i]){
                        isHeavy = true;
                        break;
                    };
                };
                if(!isHeavy){
                    //如果不是重復(fù)的,那么就執(zhí)行把當(dāng)前值推送的cache里面
                    cache.push(array[i]);
                };
            })();
        };
        return cache;
    };
     arr = toHeavy(arr);

最后說一句,現(xiàn)實(shí)中的數(shù)據(jù)肯定不會這么簡單,可能會是一個稍微復(fù)雜的數(shù)據(jù),要給這些數(shù)組去重你也不要被嚇住,其實(shí)原理是一樣的,只是你被迷惑了而已!

在一個數(shù)組中隨機(jī)抽取一部分值

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

    function getArr(num,array){
        //num表示要去多少個,它不能大于要取的那個數(shù)組的最大長度,如果超過了那么就等于它的長度
        var aLength = array.length;
        if(num>=aLength){
            num = aLength;
        };
        var cacheArr = [];
        //我們用一個數(shù)組保存原來的數(shù)組
        //記住千萬能直接賦值,因?yàn)閿?shù)組是一個引用,這樣不能保持原來的數(shù)組
        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,因?yàn)閍Length是固定的值,而array.length隨著array的改變是自動更新的
            //Math.random() * array.length得到的是一個介于長度和零之間的一個值,包括0但不包含長度值
            //我們算出的是一個浮點(diǎn)值,所以我們必須把它轉(zhuǎn)化成整數(shù)
            //因?yàn)椴荒艹^最大長度值,所以應(yīng)該向下取整
            var _index = Math.floor(Math.random() * array.length);
            cacheArr.push(array[_index]);
            //記住一定,取出來之后,一定刪除原來位置上的數(shù)組值
            //要不然數(shù)組更新不了
            array.splice(_index,1);
        };
        //取回原來的數(shù)組
        array = originArr;
        console.log(array);
        return cacheArr;
    };
    var brr = getArr(5,arr);

得到某個區(qū)間的字母組成的數(shù)組

有點(diǎn)事,后續(xù)代碼待更新……

Date: 2017-02-17

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

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

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