解析 URL Params 为对象

function parseParam(url) {
  const paramsStr = /.+\?(.+)$/.exec(url)[1]; // 将 ? 后面的字符串取出来
  const paramsArr = paramsStr.split('&'); // 将字符串以 & 分割后存到数组中
  let paramsObj = {};
  // 将 params 存到对象中
  paramsArr.forEach(param => {
    if (/=/.test(param)) { // 处理有 value 的参数
      let [key, val] = param.split('='); // 分割 key 和 value
      val = decodeURIComponent(val); // 解码
      val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字
      if (paramsObj.hasOwnProperty(key)) { // 如果对象有 key,则添加一个值
        paramsObj[key] = [].concat(paramsObj[key], val);
      } else { // 如果对象没有这个 key,创建 key 并设置值
        paramsObj[key] = val;
      }
    } else { // 处理没有 value 的参数
      paramsObj[param] = true;
    }
  })
  return paramsObj;
}
let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
console.log(parseParam(url)); 
function parseParams(url) {
  let params = {};  // 定义一个空对象用于存放解析出来的参数
  let startIndex = url.indexOf('?');  // 查找url中参数部分的起始位置
  if (startIndex !== -1) {  // 如果存在参数部分
    let paramStr = url.substr(startIndex + 1);  // 截取参数部分的字符串
    let paramArr = paramStr.split('&');  // 将参数字符串按&符号分割成数组
    paramArr.forEach(function(item) {
      let itemArr = item.split('=');  // 将每个参数项按=符号分割成数组
      let key = decodeURIComponent(itemArr[0]);  // 解码key
      let value = itemArr.length > 1 ? decodeURIComponent(itemArr[1]) : '';  // 解码value
      if (params.hasOwnProperty(key)) {  // 如果已经存在该key,则将解析出来的值以数组形式保存
        params[key] = [].concat(params[key], value);
      } else {
        params[key] = value;  // 否则直接保存
      }
    });
  }
  return params;  // 返回解析出来的参数对象
}
let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
console.log(parseParams(url)); 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值