#35 queryString 分析器


  • 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(/^\?/, '')
    

  • -1

    function parseQueryString(url) {
    url = url || window.location.href;
    var objRequest = new Object();
    if(url.indexOf("?") != -1) {
    url = url.split("?")[1];
    var strArr = url.split("&");
    for(var i = 0; i < strArr.length; i++) {
    objRequest[strArr[i].split("=")[0]] = strArr[i].split("=")[1]?decodeURI(strArr[i].split("=")[1]):null;
    }
    }
    return objRequest;
    }


  • 0

    function parseQueryString (url) {
    var a = document.createElement('a')
    a.setAttribute('href', url)
    var search = a.search
    var query = {}
    var kvs = search.replace(/^\?/, '').split(/&/g)
    kvs.forEach(function (kv) {
    kv = kv.split('=')
    if (!kv[0]) return
    if (kv.length === 2) {
    query[kv[0]] = kv[1]
    } else if (kv.length > 2) {
    query[kv[0]] = kv.slice(1).join('=')
    } else {
    query[kv[0]] = null
    }
    })
    return query
    }


  • 0

    var returnVal = {}
    var newArr = []
    var newArr1 = []
    var newArr2 = []

    const parseQueryString = url => {
    if (url.indexOf('#')) {
    url = url.split('#')[0]
    } else {
    url = url
    }
    if (url.indexOf('?') !== -1) {
    var index = url.indexOf('?')
    var newstr = url.substr(index + 1)
    if (newstr.indexOf('&')) {
    newArr = newstr.split('&')
    }
    newArr.map(arr => {
    if (arr.indexOf('#')) {
    newArr2.push(arr.split('#'))
    }
    })

    newArr2.map(arr => {
      if (arr.length > 1) {
        arr = arr.splice(1)
      }
      return arr
    })
    
    newArr2.map(arr => {
      newArr1.push(arr[0].split('='))
    })
    
    newArr1.map(arr => {
      if (arr.length) {
        if (arr.length === 1) {
          arr.push(null)
        }
      }
    })
    newArr1.map(arr => {
      var key = arr[0]
      returnVal[key] = arr[1]
    })
    

    }
    return returnVal
    }

    这个程序控制台结果正确 验证报错“处理 https://scriptoj.com/problems/#?offset=10&limit=100 的结果不正确”


  • 0

    0_1516696924377_upload-1ceaff16-9047-4f2f-a35f-43c203054b5c
    垃圾编译引擎。

    const parseQueryString = (str) => {
    	if (!str)  throw new Error('请传入字符串');
    	if (typeof str !== 'string') throw new TypeError('只接受string类型');
    	if (str.indexOf('?') < 0) return Object.create(null);
    
    	let querys = str.match(/\?.*/g)[0].replace(/\?/g, '').split('&');
    	let obj = {};
    
    	for (let i=0; i<querys.length; i++) {
    		let [key, value = null] = querys[i].split('=');
    		if (key.indexOf('#') > -1) {
    			key = key.split('#')[0];
    		}
    		if (value !== null) {
    			if (value.indexOf('#') > -1) {
    				value = value.split('#')[0];
    			}
    			if (!isNaN(value)) {
    				value = Number.parseInt(value);
    			}
    		}
    		obj[key] = value;	
    	}
    	return obj;
    }
    
    

    求测。。


  • 0

    @administrators

    function parseQueryString(str) {
        const reg = /\?([^?]*)/;
        try {
            const query = reg.exec(str)[1];
            const arr = query.split('&');
            const regSplit = /([^#]+?)=(.*)/;
            const res = {};
            arr.forEach(item => {
                if (item.indexOf('=') === -1) {
                    res[item] = null;
                } else {
                    const arrSplit = regSplit.exec(item);
                    res[arrSplit[1]] = arrSplit[2];
                }
            });
            return res;
        } catch(e) {
            return {};
        }
    }
    

    ** 求解为何不通过? **


  • 0

    const parseQueryString = function(url) {
    	var obj = {};
    	if(url) {
    	  url = url.replace(/#[^#]*$/, "");
    		var index = url.indexOf("?");
    		if(index != -1) {
    			var queryStr = url.substr(index + 1);
    			var marchResult = null;
    			var regex = /(\w+)(=([^&#]+)?)?/g;
    			while((marchResult = regex.exec(queryStr)) != null) {
    				if(marchResult[1] in obj) {
    					var values = obj[marchResult[1]];
    					if(values instanceof Array) {
    						values.push(marchResult[2] ? (marchResult[3]?marchResult[3]:"") : null);
    						obj.marchResult[1] = values;
    					} else {
    						var arr = [];
    						arr.push(values);
    						arr.push(marchResult[2] ? (marchResult[3]?marchResult[3]:"") : null);
    						obj[marchResult[1]] = arr;
    					}
    				} else {
    					obj[marchResult[1]] = marchResult[2] ? (marchResult[3]?marchResult[3]:"") : null;
    				}
    			}
    		}
    	}
    	return obj;
    }
    

登录后回复
 

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