三種方法實現:獲取 url 中的引數

立志搬磚造福生活發表於2018-08-28

題目描述:

獲取 url 中的引數

1. 指定引數名稱,返回該引數的值 或者 空字串;
2. 不指定引數名稱,返回全部的引數物件 或者 {};
3. 如果存在多個同名引數,則返回陣列 ;

題目來源(線上編輯):www.nowcoder.com/practice/a3…(牛客網)

解一:使用字串拼接匹配字元;

/*  獲取URl中的引數
* @para url 
* @para key 引數名*/
function getUrlParam(sUrl, sKey) {
    var left= sUrl.indexOf("?") + 1
    var right= sUrl.lastIndexOf("#")
    var parasString = sUrl.slice(left, right)
    var paras = parasString.split('&');
    var parasjson = {}
    paras.forEach(function (value, index, arr) {
        var a = value.split('=');
        parasjson[a[0]] !== undefined ? parasjson[a[0]] = [].concat(parasjson[a[0]], a[1]) : parasjson[a[0]] = a[1];
    });

    let result = arguments[1] !== void 0 ? (parasjson[arguments[1]] || '') : parasjson;
    return result
}複製程式碼

解二:使用正規表示式匹配字元,並使用正則Replace方法替換;

function getUrlParam2(sUrl, sKey) {
    var result, Oparam = {};
    sUrl.replace(/[\?&]?(\w+)=(\w+)/g, function ($0, $1, $2) 
        console.log('$0:' + $0 + "     $1:" + $1 + "     $2:" + $2);
        Oparam[$1] === void 0 ? Oparam[$1] = $2 : Oparam[$1] = [].concat(Oparam[$1], $2);
    });
    sKey === void 0 || sKey === '' ? result = Oparam : result = Oparam[sKey] || '';
    return result;
}複製程式碼

此處註明正則:/[\?&]?(\w+)=(\w+)/g(使用Regexper線上工具將正則轉成視覺化的圖形,簡單易懂)

regexper.com/

三種方法實現:獲取 url 中的引數

解三:使用正規表示式匹配字元,並使用正則Exec方法進行組裝;

function getUrlParam3(sUrl, sKey) {
    var resObj = {};
    var reg = /(\w+)=(\w+)/g;
    while (reg.exec(sUrl)) {
        resObj[RegExp.$1] ? resObj[RegExp.$1] = [].concat(resObj[RegExp.$1], RegExp.$2) : resObj[RegExp.$1] = RegExp.$2;
    }
    if (sKey) {
        return (resObj[sKey] ? resObj[sKey] : '');
    }
    return resObj;
}複製程式碼

此處註明正則:/(\w+)=(\w+)/g

三種方法實現:獲取 url 中的引數

MDN RegExp exec 方法API:developer.mozilla.org/zh-CN/docs/…

測試:

let url = 'http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe'
let result = getUrlParam(url)
let result2 = getUrlParam(url, 'key')
console.log(result)
console.log(result2)複製程式碼

控制檯輸出結果如圖:

三種方法實現:獲取 url 中的引數

AC!!!


相關文章