#35 queryString 分析器


  • 0

    实在不会用正则取search串,所以用截取字符串形式,期待大佬公布个更优雅的方式

    const parseQueryString = str => str.indexOf('?') > -1 && str.indexOf('#') < 0 || str.indexOf('?') < str.indexOf('#') ? str.substring(str.indexOf('?') + 1, str.lastIndexOf('#') > 0 ? str.lastIndexOf('#') : str.length).split('&').reduce((obj, c) => Object.assign(obj, { [/([^=]+)(=?)(.*)/g.exec(c)[1]]: (/([^=]+)(=?)(.*)/g.exec(c)[2] ? /([^=]+)(=?)(.*)/g.exec(c)[3] : null) }), {}) : {}
    

  • 0

    const parseQueryString = (url) => {
    let result = {};
    if(url.indexOf('#')< url.indexOf('?')){
    url.replace(/(?:?)(\w+=?\d*(&\w+=?\S*))/, (a,b) => {
    let data = b;
    data.split('&').map( (item) => {
    item.replace(/(\w
    )(=?)(\S*)/, ($1 ,$2, $3, $4) => {
    result[$2] = $3 ? $4 : null;
    })
    })
    })
    }
    return result;
    }
    哈希后面应该返回什么呀


  • 0

    const parseQueryString = url => {
      const index1 = url.indexOf('?');
      const index2 = url.indexOf('#');
      
      // 处理的情况1:没有查询参数
      // 处理的情况2:如果#在?前面,#后面认为都是hash,而非查询参数
      if (index1 === -1 || (index1 > index2 && index2 !== -1)) {
        return {}
      }
      // 处理的情况3:如果没有#参数,直接取?后面的字符串
      // 处理的情况4:如果#在?后面,取?和#之间的字符串
      let str = (index2 === -1) ? url.slice(index1 + 1) : url.slice(index1 + 1, index2);
      
      return str.split('&').reduce((total, current) => {
        // 处理的情况5:?name&age=12返回{ name: null, age: '12' }
        if (current.indexOf('=') === -1) {
          total[current] = null;
        } else {
          // 处理的情况6 value中有多个=的情况
          const index = current.indexOf('=');
          const key = current.slice(0, index);
          const value = current.slice(index+1);
          // 处理的情况7 ?name=&age=12 则返回 { name: '', age: '12' }
          total[key] = value || '';
        }
        return total;
      }, {});
    };
    

  • 0

    @ScriptOJ
    我这个有什么问题么?

    const parseQueryString = (str) => {
    let arr1, arr2, arr3
    let obj = {}
    if (str.indexOf('?') !== -1) {
    arr1 = str.split('?')
    if (arr1.length > 0) {
    arr2 = arr1[1].split(/[&#]/)
    for (let i = 0; i < arr2.length; i++) {
    arr3 = arr2[i].split('=')
    if (arr3[1] === undefined) {
    arr3[1] = null
    }
    obj[arr3[0]] = arr3[1]
    }
    }
    }
    return obj
    }/* TODO */


  • 0

    const parseQueryString = function (str) {
    let search = str.match(/?.+$/);
    if (search) {
    search = search[0];
    } else {
    return {};
    }
    let queries = search.replace(/^?/, '').split(/&/g);
    let res = {};
    for(let each of queries) {
    let key = each.match(/(.+?)=/);
    let value = each.match(/=(.*)?/);
    if (key && !(key[1] in res)) {
    if (value) {
    res[key[1]] = value[1] === undefined ? '' : value[1]
    }
    } else {
    res[each] = null;
    }
    }
    return res;
    }
    你好 跑这个例子的时候不让通过,看了答案发现结果是一样的
    https://scriptoj.com/problems/?offset=&limit=100#name=jerry”


  • 0

    0_1549373934631_#35 queryString 分析器.png


  • 0

    const parseQueryString = (url) => {
      const search = new URL(url).search.substring(1);
      if(!search) return {};
      return search.split("&").reduce((total, value) => {
        const [key, ...values] = value.split("=")
        if (values.length === 0) {
          total[key] = null
        } else {
          total[key] = values.join("=")
        }
        return total
      }, {})
    }

  • 0

    终于通过了,这里的坑太多了,不对比URI.js执行结果,还真不好整,写的有点多...
    let parseQueryString = url => {
    	const delIndex = url.indexOf('#') < 0 ? url.length : url.indexOf('#');
    	url = url.slice(0, delIndex)
    	console.log(url)
    	const index = url.indexOf('?')
    	if (index < 0) return {}
    	let queryArr = url.slice(index + 1).split('&')
    	queryArr = queryArr.map(item => {
    		const arr = []
    		const i = item.indexOf('=')
    		const n = i < 0 ? item.length : item.indexOf('=')
    		arr[0] = item.slice(0, n)
    		arr[1] = i < 0 ? null : item.slice(n + 1, item.length)
    		return arr
    	})
    	const query = {}
    	queryArr.forEach(item => {
    		if (item.length === 1) {
    			query[item] = null
    		} else {
    			query[item[0]] = item[1]
    		}
    	})
    	return query
    }
    

  • 0

    0_1558514215802_upload-39b76c39-d841-42f0-9ba2-1ec42425c821 针对带两个问号的正确执行结果应该是什么?
    预测结果一:{offset: "10", limit: "100", tag: "all?name"}
    预测结果二:{all: "name"}
    以上两种都不对。


  • 0

    测试通过

    const parseQueryString = url => {
      let ret = {};
      let s1 = url.match(/(#\/?)?\?([\w=&?]*)#?/);
    
    // 此处是解决 xxx/#/?offset=10&limit=100
      if (!s1 || !s1[2] || (s1[1]&&s1[1][0] === '#')) {
        return ret;
      }
      let ary = s1[2].split('&');
      ary.forEach(item => {
        let tempAry = item.split('=');
    
    // 此处是解决 xxx?offset=10&limit=100&tag=all?name=lucy
        if (tempAry.length > 2) {
          tempAry[1] = tempAry.slice(1).join('=');
          tempAry.length = 2;
        }
        if (tempAry.length === 2) {
          ret[tempAry[0]] = tempAry[1] ? tempAry[1] : '';
        }  else {
          ret[tempAry[0]] = null;
        }
      });
      return ret;
    };
    

登录后回复
 

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