parseUrl 解析 url 路径字符串为参数对象,各种场景基本都考虑到了

454 阅读1分钟

没啥好说的,直接上代码

 function parseUrl(search) {
    if (typeof search !== 'string' || !search) return {}; // 非 string,或者为空 直接返回 {}
    if (search.startsWith('http://') || search.startsWith('https://')) {
        search = search.split('?')[1];
    }
    if (!search) return {}; // 为空直接返回 {}
    const params = {}; //定义数组
    const list = search.slice(1).split('&'); // 去除 ? ,根据 & 切分参数
    list.forEach(item => {
        const [k, v] = item.split('='); // 根据 = 分割出 key 和 value
        // 根据实际使用情况看是否需要把值转成 undefined !!!
        const v2: any = v !== '' ? window.decodeURI(v) : undefined;
        // const v2 = window.decodeURI(v);
        // if (k === '') {
        //     // 不存在 key 的时候  存放到 __ 中,默认都放到了 '' 中
        //     params['__'] = params['__'] === undefined ? [v2] : [].concat(params['__'], v2);
        //     return;
        // }
        if (params[k] === undefined) {
            params[k] = v2;
        } else {
            // 多个同名参数处理到一个数组中
            params[k] = [].concat(params[k], v2);
        }
    });
    return params; //返回这个数组.
}