url中的参数提取为对象,这样的写法不对么

面试碰到这个问题,我按照这个思路写的方案,他最后让我回去再看看,我想问下,还有什么更好的实现方式么?

var url = "http://www.xxxx.com/index.html?keya=a&b=b&c=c";   
function parseQueryString(argu){
  var str = argu.split('?')[1];
  var result = {};
  var temp = str.split('&');
  temp.forEach(function(item){ 
    var temp2 = item.split('=');
    result[temp2[0]] = temp2[1];
  })
  return result;
}
console.log(parseQueryString(url))

阅读 2.4k
3 个回答

感觉你的思路没有问题。精简结构,我能写成这样

const parseQueryString = argu => (
  argu.split('?')[1]
    .split('&')
    .reduce((result, pair) => {
      const [key, value] = pair.split('=')
      return {
        ...result,
        ...((key && value) ? { [key]: value } : {})
      }
    }, {})
)

另外你似乎没考虑键值对可能出错的情况

可以用正则/(1+)=1/g
另外注意一个建可能有多个值
比如?a=1&a=2这种要搞成一个数组


  1. =&?

“让我回去再看看”,怕是少了个 decodeURIComponent
犀牛书上有一段:

function urlArgs() {
    var args = {}
    var query = location.search.substring(1)
    var pairs = query.split("&")
    for (var i = 0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf("=")
        if (pos == -1) continue
        var name = pairs[i].substring(0, pos)
        var value = pairs[i].substring(pos + 1)
        value = decodeURIComponent(value)
        args[name] = value
    }
    return args
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题