JavaScript 一道字符串分解的题目

  去某公司(公司名不说了,人这套题说不定还要用)面试,现场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