編寫一個函數接受 url 中 query string 爲參數, 返回解析後的 Object,query string 使用 application/x-www-form-urlencoded 編碼
/** * 解析query string轉換爲對象,一個key有多個值時生成數組 * * @param {String} query 須要解析的query字符串,開頭能夠是?, * 按照application/x-www-form-urlencoded編碼 * @return {Object} 參數解析後的對象 */ function parseQuery(query) { var result = {}; // 若是不是字符串返回空對象 if (typeof query !== 'string') { return result; } // 去掉字符串開頭可能帶的? if (query.charAt(0) === '?') { query = query.substring(1); } var pairs = query.split('&'); var pair; var key, value; var i, len; for (i = 0, len = pairs.length; i < len; ++i) { pair = pairs[i].split('='); // application/x-www-form-urlencoded編碼會將' '轉換爲+ key = decodeURIComponent(pair[0]).replace(/\+/g, ' '); value = decodeURIComponent(pair[1]).replace(/\+/g, ' '); // 若是是新key,直接添加 if (!(key in result)) { result[key] = value; } // 若是key已經出現一次以上,直接向數組添加value else if (isArray(result[key])) { result[key].push(value); } // key第二次出現,將結果改成數組 else { var arr = [result[key]]; arr.push(value); result[key] = arr; } // end if-else } // end for return result; } function isArray(arg) { if (arg && typeof arg === 'object') { return Object.prototype.toString.call(arg) === '[object Array]'; } return false; } /** console.log(parseQuery('sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8')); */
參考:https://github.com/sunlianguang/FE-interview#編寫一個函數接受url中query-string爲參數返回解析後的objectquery-string使用applicationx-www-form-urlencoded編碼