手撕算法-解析URL

674 阅读1分钟

思路:字符串打断为数组 先分成两部分,取出协议和域名 然后对后一部分拆分,根据url的定义,?后为paramas,按其拆分,放进对象即可

  const urlStr = 'https://pages.tmall.com/wow/hdwk/act/2020nhj-single?wh_biz=tm&disableNav=YES&disableProgress=YES&hd_from=alipay_mayifarm&hd_from_id=100085&sceneId=972&deliveryId=8945&task_type=callapp&sceneCode=FUGUO&implId=other_0_158001_8945_0&query=spm&prismFrom=alipay_mayifarm&slk_gid=gid_er_er%7Cgid_er_evoke_ui_2%7Cgid_er_af_pop%7Cgid_er_sidebar_1&_afc_link=1&utparamcnt=%7B%22_afc_link%22%3A%221%22%7D#state';
  function urlSearch(href) {
    let name, value;
    let str = decodeURI(href);
    let patrol = str.split("://");

    const json = {};
    json["patrol"] = patrol[0];
    json["host"] = patrol[1].split("/")[0];

    let paramaIndex = str.indexOf("?");
    let paramas = str.substr(paramaIndex + 1).split("&");

    for(let parama of paramas){
      let index = parama.indexOf("=");
      if(index > 0){
        name = parama.substring(0, index);
        value = parama.substring(index + 1);
        json[name] = value;
      }
    }

    return json;
  }

输出

{
    "patrol": "https",
    "host": "pages.tmall.com",
    "wh_biz": "tm",
    "disableNav": "YES",
    "disableProgress": "YES",
    "hd_from": "alipay_mayifarm",
    "hd_from_id": "100085",
    "sceneId": "972",
    "deliveryId": "8945",
    "task_type": "callapp",
    "sceneCode": "FUGUO",
    "implId": "other_0_158001_8945_0",
    "query": "spm",
    "prismFrom": "alipay_mayifarm",
    "slk_gid": "gid_er_er|gid_er_evoke_ui_2|gid_er_af_pop|gid_er_sidebar_1",
    "_afc_link": "1",
    "utparamcnt": "{\"_afc_link\"%3A\"1\"}#state"
}