去某公司(公司名不說了,人這套題說不定還要用)面試,現場30分鐘做了一套題,其中有一道是這樣的:
要求用js寫一個函數,對傳入的形如下網址字串,返回對應的對象。
如:
若傳入字串a='?name=zhiyelee&blog=www.tsnrose.com';
則返回 b={‘name':'zhiyelee','blog':'www.tsnrose.com'}
當時由於時間比較短,實現的有些問題,回來後想了一下,總結如下:
我想到了兩種思路,一種是使用Regex,第二種是使用字串的split函數。
1、使用Regex處理
我首先想到的是使用Regex處理,可能是感覺這個更有挑戰性寫起來也最簡潔,不過當時懷疑這種方法的效率會低於直接使用字串函數處理的效率。這個效率我們在下文會驗證~
這個方法的思路很簡單,就是使用Regex每次匹配出一個‘***=###'串,然後迴圈最後取出所有。
代碼如下 複製代碼 代碼如下:var getNRReg = function(str) {
var res = {};
var reg = /(\w+)=(\w+)/g;
while ((a = reg.exec(str))) {
res[a[1]] = a[2];
}
return res;
};
2、使用字串函數處理
這種想法思路也比較常規,不過寫起來肯定要比使用Regex處理麻煩一些。
我的思路首先用‘&'將原串分割成多個字串,每個字串的樣式如‘***=###',然後再對字串應用split(‘=')。(此種方法沒有使用正則,當然我們可以使用正則split(/&|=/)
代碼如下 複製代碼 代碼如下:var getNRSplit = function(str) {
var temp, res = {},
i, ret;
str = str.slice(1);
temp = str.split('&');
for (i = 0; i < temp.length; i++) {
ret = temp[i].split('=');
res[ret[0]] = ret[1];
}
return res;
}
這兩種方法的效率問題
眾所周知Regex的效率有點低,因此最初認為第一種方案的效率肯定要低於第二種方案的效率,於是實測了下,結果不然:
執行1000000次的耗時情況:
getNRReg執行耗時 4399ms
getNRSplit執行耗時 6116ms
完整原始碼查看: jsfiddle ,可以自行測試~
ps:
最後附上新浪微博2011-06-15 在北郵宣講會前端崗位的一道筆試題:
用Regex完成刪除與某個字元相鄰且相同的字元,比如“fdaffdaaklfjk”字串處理之後成為“fdafdakljk”。
我的答案見 jsfiddle