前言
因?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