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