开发者社区> 问答> 正文

解析 URL Params 为对象?

let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled'; parseParam(url)

/* 结果 { user: 'anonymous', id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型 city: '北京', // 中⽂需解码 enabled: true, // 未指定值得 key 约定为 true } */


【精品问答】前端面试手册

【精品问答】前端面试手册之算法/笔试题篇

展开
收起
前端问答 2019-12-15 16:16:33 1479 0
1 条回答
写回答
取消 提交回答
  • 前端问答小助手
    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;
    }
    
    
    2019-12-15 16:17:40
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像