70%开发工程师不知道的获取url的方式 --最简单没有之一

1,517 阅读4分钟

封装 获取一个URL地址问号后面传递的参数信息 以及 哈希值 HASH 方法 <白话文>

最 low的方法实现

这是最终我们要拿到的结果



  结果:{
     lx:1,
     name:'zhufeng',
     teacher:'aaa',
     HASH:'box'
  }
  最终我们要拿到的结果  对象格式

详细的解析步骤走向 秒懂 步步解析


/*
 * 结果:{
 *    lx:1,
 *    name:'zhufeng',
 *    teacher:'aaa',
 *    HASH:'box'
 * }
 */
let url = 'http://www.zhufengpeixun.cn/index.html?lx=1&name=zhufeng&teacher=aaa#box';
//1.获取问号或者井号后面的值

let askIndex = url.indexOf('?'); // ? 第一次出现的位置索引 存在 askIndex
let wellIndex = url.indexOf('#'); // # 第一次出现的位置索引 存在 wellIndex
let askText = url.substring(askIndex + 1, wellIndex); // 从?的具体索引 +1 截取到# 的索引位置不包括#号   存在  askText
let wellText = url.substring(wellIndex + 1);  // 从#位置索引 +1 截取到最后   存在 wellText
// askText => "lx=1&name=zhufeng&teacher=aaa"
// wellText => "box"
//2.问号后面值的详细处理
let result = {};  //  空对象
let askAry = askText.split('&');  // 用指定的 & 分隔符 把?号后面获取到的字符串 拆成数组
// askAry  =>["lx=1", "name=zhufeng", "teacher=aaa"]
askAry.forEach(item => {   // forEach 遍历这个 askAry 数组
    // item:当前从数组中循环的这一项

    // item:"lx=1"
    // item:"name=zhufeng"
    // item:"teacher=aaa"
    let n = item.split('='); // 在把数组中 item 的每一项用 = 拆分成数组
    // n  [ '1x','1' ]
    // n  [ 'name','zhufeng']
    // n  [ 'teacher','aaa']
    let key = n[0];
    // key  n[0] => 1x
    // key  n[0] => name
    // key  n[0] => techer
    let value = n[1];
    // value  n[1] => 1
    // value  n[1] => zhufeng
    // value  n[1] => aaa
    result[key] = value;
    //  key : value  =>    1x : 1
    //  key : value  =>  name : zhufeng
    //  key : value  =>  teacher : aaa
});
result['HASH'] = wellText;
// key= HASH : wellText= wellText
console.log(result);

// 控制台输出最终结果
{lx: "1", name: "zhufeng", teacher: "aaa", HASH: "box"}
HASH: "box"
lx: "1"
name: "zhufeng"
teacher: "aaa"

在这里插入图片描述

没有什么是一张图解决不了事情 , 不行就两张 看过图你会更清晰

如此 LOW 的东西你是不是看到害怕 那么 如此繁琐的东西怎么能不让<一等公民> FUNCTION 出来耍

啰嗦两句 编程开发最好的开发习惯
代码洁癖
代码强迫症
极客精神

封装的此方法足以让你应对开发实战的 需求 代码健壮应容错应强


/**
 * queryURLParams: 获取URL地址中间问号传参的信息和哈希值
 * @params
 *     url [string] 要解析的URL字符串
 * @return
 *     [object] 包含参数和哈希值信息的对象
 * by  Take_fly  on 2019、 08、 31
 */
 //  写 注释 和 写好清晰明了的注释你会很受他人欢迎和 相应的尊重

function queryURLParams(url) {
	//1.获取?和#后面的信息
	let askIn = url.indexOf('?'),
		wellIn = url.indexOf('#'),
		askText = '',
		wellText = '';
	// #不存在
	wellIn === -1 ? wellIn = url.length : null;
	// ?存在
	askIn >= 0 ? askText = url.substring(askIn + 1, wellIn) : null;
	wellText = url.substring(wellIn + 1);

	//2.获取每一部分信息
	let result = {};
	wellText !== '' ? result['HASH'] = wellText : null;
	if (askText !== '') {
		let ary = askText.split('&');
		ary.forEach(item => {
			let itemAry = item.split('=');
			result[itemAry[0]] = itemAry[1];
		});
	}
	return result;
}

此时就结束了 , no 方法封装出不执行那就是一堆破代码 有用么 就好比 你买一台全自动洗衣机回家 , 往墙角一堆 ,那就是是一个大破铁壳子 他有什么用途么没有 ,函数也是如此


各种情况下 代码的容错性
let aa = 'http://www.zhufengpeixun.cn/index.html?lx=1&name=zhufeng&teacher=aaa#box';
let paramsObj = queryURLParams(aa);
console.log(paramsObj);
结果:
 {HASH: "box", lx: "1", name: "zhufeng", teacher: "aaa"};

没有  哈希值 也不会报错
let aa = 'http://www.zhufengpeixun.cn/index.html?lx=1&name=zhufeng&teacher=aaa';
let paramsObj = queryURLParams(aa);
console.log(paramsObj);
结果: 
{lx: "1", name: "zhufeng", teacher: "aaa"};

此时的URL 和 HASH  都没有  
let aa = 'http://www.zhufengpeixun.cn/index.html';
let paramsObj = queryURLParams(aa);
console.log(paramsObj);
最终结果:对象
{ }

此时的你是不是在博主是不是太太太 LOW 了 那么 逼格 来了o 优秀的 REGEXP 效率那是无法估量的

基于正则封装的才是最完美的

代码的容错性和健壮性会更强大

基于封装方法和正则的 优点

  • 代码健壮性强
  • 容错兼容问题优化

function queryURLParams(url) {
	let result = {},
		reg1 = /([^?=&#]+)=([^?=&#]+)/g,
		reg2 = /#([^?=&#]+)/g;
	url.replace(reg1, (n, x, y) => result[x] = y);
	url.replace(reg2, (n, x) => result['HASH'] = x);
	return result;
} 


let aa = 'http://www.zhufengpeixun.cn/index.html?lx=1&name=zhufeng&teacher=aaa#box';
let paramsObj = queryURLParams(aa);
console.log(paramsObj);

那么那么 我所说的百分之70%开发工程不知道的 在哪里 他来了

~function(){
    /*
     * getParam:获取URL问号传参中某一个参数对应的值
     *   @params
     *      key:要获取值的属性名
     *   @return
     *      当前传递KEY对应的属性值
     * by  Take_fly  on 2019、 08、 31
     */
    function getParam(key){
        //1.先获取URL字符串中所有问号参数信息
        //验证是否存在问号,不存在无需处理
        let obj={},
            _this=this,
            askIn=_this.indexOf('?');
        if(askIn===-1) return;
        //获取问号后面的参数信息
        let link=document.createElement('a'),
            askText=null;
        link.href=_this;
        askText=link.search.substring(1);
        //把参数信息解析成为键值对的方式
        askText.split('&').forEach(item=>{
            let [key,value] = item.split('=');
            obj[key] = value;
        });
        //2.获取对应的属性值并返回
        return obj[key];
    }
    String.prototype.getParam=getParam;
}();
var url="locallhost?key1=val1&key2=val2&key3=val3";
console.log(url.getParam("key3")); //=>'val3'


知道你们都是那么聪明的高级开发工程师 其中一眼秒懂了吧 在控制台 输出consoile .dir(a)

不善言辞 愿你有所收获

               **信念
                         道之所限
                                     愿力突破**