最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 解析复杂URL【面试题】

    正文概述 掘金(制杖)   2021-01-07   328

    Question

    输入:

    例如:url = www.youzan.com?name=coder&age=20&callback=https%3A%2F%2Fyouzan.com%3Fname%3Dtest&list[]=a&json=%7B%22str%22%3A%22abc%22,%22num%22%3A123%7D

    输出:

    {
      name: "coder",
      age: "20",
      callback: "https://youzan.com?name=test", 
      list: ["a"],
      json: {
          str: 'abc',
          num: 123
       }
    }
    

    key factors analysis【看似容易,还是遇到几个坑】

    1. url中部分特殊符号乱码,需要进行解码处理。

    这里用到JavaScript自带的decodeURIComponent(url)方法进行解码,也可以自写decode函数。

    ['%3A' => ':'], ['%2F%2F' => '//'] ['%3F' => '?'] ['%3D' => '=']

    //url = https://www.youzan.com?name=coder&age=20&callback=https%3A%2F%2Fyouzan.com%3Fname%3Dtest&list[]=a&json=%7B%22str%22%3A%22abc%22,%22num%22%3A123%7D
    url = decodeURIComponent(url);
    //url = https://www.youzan.com?name=coder&age=20&callback=https://youzan.com?name=test&list[]=a&json={"str":"abc","num":123}
    

    2. 不能用常规的‘?’分离出参数部分

    因为callback=https://youzan.com ? name=test 也包含问号,会导致分割出错。那么更合理的分割方式是直接用每个参数连接符号‘&’分割每个参数。

    let paramArrays = url.split('&');
    

    3. 处理第一项参数的多余前缀。

    第一个参数项前半部分是访问地址,需要去掉。

    注意,方法一有问题,当把callback参数放在第一个参数的位置,会出现name=test。方法二是改进方法。

    // 方法一
    paramArrays[0]= paramArrays[0].split('?')[1];
    // 方法二
    paramArrays[0] = paramArrays[0].split('?');
    paramArrays[0].shift();
    paramArrays[0] = paramArrays[0].join('?');
    

    4. 把每个参数项目分割出键值对注意等号=特殊情况

    如:callback=https://youzan.com?name = test 参数的value中也携带了=时候,用方法一也导致value的第一个=后面内容丢失,改进方法二。

    // 方法一
    let itemArray = item.split('=');
    let key = itemArray[0], value = itemArray[1]; //丢失'test'
    // 方法二
    let itemArray = item.split('=');
    let key = itemArray.shift(), value = itemArray.join('='); // 注意多个等号切割问题
    

    Answer

    const testURL = 'https://www.youzan.com?name=coder&callback=https%3A%2F%2Fyouzan.com%3Fname%3Dtest&age=20&callback=https%3A%2F%2Fyouzan.com%3Fname%3Dtest&list[]=a&json=%7B%22str%22%3A%22abc%22,%22num%22%3A123%7D';
    function parseQuery(url) {
        let decodeUrl = decodeURIComponent(url);
        let obj = {};
        let paramArrays = decodeUrl.split('&');
        paramArrays[0] = paramArrays[0].split('?');
        paramArrays[0].shift();
        paramArrays[0] = paramArrays[0].join('?');
    
        paramArrays.map((item) => {
            let itemArray = item.split('=');
            let key = itemArray.shift(), value = itemArray.join('='); // 注意多个等号切割问题
            // 处理数组list[]=a 特殊情况
            if(key.indexOf('[') + 1 === key.indexOf(']')) {
                key = key.slice(0, key.length-2);
                value = [].concat(value);
            }
            obj[key] = value;
        })
        return obj;
    }
    parseQuery(testURL)
    
    
    「以上纯属个人解答,欢迎指出不足之处!」

    解析复杂URL【面试题】


    起源地下载网 » 解析复杂URL【面试题】

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元