4 个回答

一切没有返回值的 replace 都是耍流氓

var obj = url.match(/([^=?&]+)(=[^=?&]+)?/g)
  .reduce(function (acc, match) {
    var splits = match.split('='),
        key = splits[0],
        value = decodeURIComponent(splits[1] || '') || true
    if (acc[key] === undefined) acc[key] = value
    else acc[key] = [].concat(acc[key], value)
    return acc
  }, {})


// 或者如果使用 ES6 语法
const obj = url.match(/([^=?&]+)(=[^=?&]+)?/g)
  .map(match => match.split('='))
  .reduce((acc, [key, valueStr]) => {
    const value = decodeURIComponent(valueStr || '') || true
    return {
      ...acc,
      [key]: acc[key] === undefined ? value : [].concat(acc[key], value)
    }
  }, {})

希望对你有帮助。

供参考

const obj = url
  .substr(1)
  .split('&')
  .reduce((o, p) => {
    let [k, v = ''] = p.split('=')
    v = v === '' || (isNaN(v) ? v : Number(v))
    o[k] = o[k]
      ? Array.isArray(o[k])
        ? [...o[k], v]
        : [o[k], v]
      : v
    return o
  }, {})
var url = '?user=cmz&age=21&age=23&city=北京&enable'
/**
 *
 * @param {string} string
 */
function parse(string) {
  let query = string.replace(/^\?/, '')
  return query.split('&').reduce((obj, next) => {
    let parts = next.split('=')
    let key = parts[0]
    let value = parts[1]
    if (obj.hasOwnProperty(key)) {
      obj[key] = Array.isArray(obj[key]) ? [...obj[key], value] : [obj[key], value]
    } else {
      obj[key] = value ? value : true
    }
    return obj
  }, {})
}
console.log(parse(url))

感觉写的更复杂。

权当抛砖引玉。

要在赋值的地方做个判断

// 先声明一个变量
var hash = {};
url.replace(//([^=?&]+)=([^=?&]+)//g,function(){
    if(!hash[obj[arguments[1]]]){
        obj[arguments[1]] = arguments[2];
        hash[arguments[1]] = true;
    }else{
        // 这里做是否是第一个 条件判断看你自己的需求
        if(Array.isArray(obj[arguments[1]])){
            obj[arguments[1]].push(arguments[2]);
        }else{
            const firstVal = obj[arguments[1]];
            obj[arguments[1]] = [firstVal,arguments[2]];
        }
    }
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题