#35 queryString 分析器


  • 0
    administrators

    在开发当中,我们经常要处理 url。而 url 上的 query string 是我们重点要处理的对象,完成一个 parseQueryString 函数。它接受一个 url 字符串作为参数,返回一个对象,这个对象包含 query string 上的键值对。例如:

    parseQueryString('https://scriptoj.com/problems?offset=100&limit=10')
    

    返回:

    { offset: '100', limit: '10'}
    

    特殊情况说明:如果出现 ?name=&age=12 则返回 { name: '', age: '12' },如果 ?name&age=12 则返回 { name: null, age: '12' }

    请考虑清楚 query string 可能出现的各种情况,包括可能的出现 hash 的情况(?name=jerry#nice)。

    如果需要帮助,可以对照参 URI.js 的执行结果。

    (本题来源:阿里巴巴前端笔试题)


  • 0

    0_1494833130763_QQ截图20170515152513.png

    在控制台测试url是通过的但提示属性0为null 无法得知传入的参数。。

    代码写的不太好看哈哈


  • 0
    administrators

    @kira 能把代码贴出来吗,不要截图。我跑一下看看你是哪个测试用例没过。


  • 0

    @胡子大哈

    const parseQueryString = (url) => {
      if (typeof url === 'string'){
        let obj = {}
        const paramPart = url.replace(/#\S*/, '').match(/\?[^#]+/);
        if (paramPart === null) {
          return {}
        }
        const paramGroup = paramPart[0].substr(1).split('&')
        for (let i = 0, length = paramGroup.length; i < length; i++){
          let name = paramGroup[i].split('=')[0];
          let value = paramGroup[i].match(/[=]\S+/)[0].substr(1);
          obj[name] = value
        }
        
        return obj
      } else {
        throw new Error('请传入字符串')
      }
    }
    
    

    谢谢


  • 0
    administrators

    @kira 'http://scriptoj.com/?offset=&limit=10' 这个测试用例有问题。


  • 0
    administrators

    @kira 这道题的坑还挺多的,最好能对照 URI.js 的运行结果哈


  • 0

    @胡子大哈 嗯嗯


  • 0
    administrators

    @kira 恭喜你拿了这题的一血


  • 0

    @胡子大哈 代码一点都不美观 [笑cry]


  • 0

    @胡子大哈 大哈,我的问题也是 在控制台测试url是通过的但提示属性0为null 可以帮我看看是哪个没通过吗..我自己运行几种情况都是可以的..

    const parseQueryString = (url) => {
      const paraString = url.match(/\?{1}[^\#]+/)
      const paramString = paraString[0].substring(1, paraString[0].length)
      const paramArr = paramString.split("&")
      const obj = {}
      paramArr.reduce((obj, item) => {
        const nowArr = item.split('=')
        nowArr.length === 2 ? obj[nowArr[0]] = nowArr[1] : obj
        nowArr.length === 1 ? obj[nowArr[0]] = null : obj
        return obj
      }, obj)
      return obj
    }
    

    这是代码,谢谢了


  • 0
    administrators

    @ackerMan 这个没过 https://scriptoj.com/


  • 0

    @胡子大哈 谢谢大哈..现在还有个问题 先上一下我现在的代码..

    const parseQueryString = (url) => {
          const paraString = url.match(/\?{1}[^\#]+/)
          if(!paraString) return {}
          const paramString = paraString[0].substring(1, paraString[0].length)
          const paramArr = paramString.split("&")
          const obj = {}
          paramArr.reduce((obj, item) => {
            const nowArr = item.split('=')
            nowArr.length === 2 ? obj[nowArr[0]] = nowArr[1] : obj
            nowArr.length === 1 ? obj[nowArr[0]] = null : obj
            return obj
          }, obj)
          return obj
     }
    

    运行说 处理 https://scriptoj.com/problems/#?offset=10&limit=100 的结果不正确
    但是我本地运行是对的..这是结果0_1495076276593_queryString.png 请问这是为什么,能帮我看一下吗.. 打扰您了。


  • 0
    administrators

    @ackerMan # 号后面应该都是 hash,所以 # 后面都不是 query string,所以应该是 {}


  • 0

    怎么贴代码呢,本地测试通过了,上面提示没通过


  • 0
    administrators

    @marlboro 你可以把代码和出错信息都贴一下。代码用 markdown 语法的 ``` 包裹起来。


  • 0

    处理 https://scriptoj.comproblems/?offset=10&limit=100&tag=all?name=lucy 的结果不正确
    正确的应该是什么


  • 0

    var parseQueryString = (url)=> {
        let uri = url.indexOf('#');
        let index = url.indexOf('?') +1;
        let text = url.slice(index,uri)
        console.log(text)
        let nums = text.split("&");
        const res = {};
        if(nums.length!==1){
            nums.map( (ele) => {
                let part = ele.split("=");
                res[part[0]] = (part[1] == undefined) ? null : part[1]
            })
        }
        return res
    }
    //提交后显示处理 https://scriptoj.com?offset=10&limit=100 的结果不正确
    
    

    胡子大大给看看呗 。在控制台输出正常


  • 0

    哈希应该返回什么呀,哈希#后面的是不返回还是返回的和&后面的一样


  • 0

    用 URL API 会方便很多:

    const parseQueryString = url => {
      const search = new URL(url).search
      if (search === '') {
        return {}
      }
      const kv = search.substr(1).split('&')
      const result = kv.reduce((obj, kv) => {
        const [k, ...v] = kv.split('=')
        obj[k] = v.length === 0 ? null : v.join('=')
        return obj
      }, {})
      return result
    }
    

  • 0

    @nikaple
    如果是浏览器端的话
    可以

    var a =  document.createElement('a');
    a.href = url;
    var s = a.search.replace(/^\?/, '')
    

登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待