1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
4. 不支持URLSearchParams方法
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe key
[1, 2, 3]
function getUrlParam(sUrl, sKey) {
var index1 = sUrl.indexOf('?');
var index2 = sUrl.indexOf('#');
var sUrlTar = sUrl.slice(index1+1,index2).split('&');
if(!sKey){
var newObj ={}
sUrlTar.forEach((elm) => {
if (!(elm.split('=')[0] in newObj)) {
newObj[elm.split('=')[0]] = []
}
newObj[elm.split('=')[0]].push(elm.split('=')[1])
})
return newObj
}
var ans = [];
sUrlTar.forEach((item) => {
if(item.indexOf(sKey + '=') === 0){
ans.push(item.slice(item.indexOf('=')+1,item.length))
}
})
return ans.length === 0 ? '': ans.length === 1? ans[0]:ans
} function getUrlParam(sUrl, sKey) {
const Param = {}
//获得参数段
var arr=sUrl.split('?')[1].split('#')[0].split('&')
for (let key of arr){
//k为参数,v为值
let k = key.split('=')[0]
let v = key.split('=')[1]
if(!Param[k]){
Param[k] = v
}else{
Param[k] = Array.from(Param[k]).concat(v)
}
}
return sKey===void 0 ? Param : Param[sKey] || ''
} 因为同名参数,值是个数组,所以可以直接用Array.from将已有参数转为数组,concat添加同名参数的其他参数值
function getUrlParam(sUrl, sKey) {
let reg = /([^?&=]+)=([^?&=])/g
let sKeys = sUrl.match(reg)
let sKeyObjs = {}
sKeys.forEach(item=>{
let key = item.split("=")[0]
let value = item.split("=")[1]
if(!sKeyObjs[key]){
sKeyObjs[key]=[]
}
sKeyObjs[key].push(value)
})
if(sKey === undefined){
return sKeyObjs
}else{
let sKeyValues = []
if(sKeyObjs[sKey]){
sKeyValues = sKeyObjs[sKey]
}
return sKeyValues.length===0?"":sKeyValues.length>1?sKeyValues:sKeyValues[0]
}
}
/([^?&=]+)=([^?&=])/g然后进行数组和对象操作就行了
function getUrlParam(sUrl, sKey) {
let result = [];
const entries = new URL(sUrl).searchParams.entries();
for (let entry of entries) {
result.push(entry);
}
if (sKey) {
const filtered = result.filter((entry) => {
if (entry[0] === sKey) {
return true;
}
return false;
});
if (filtered.length === 0) {
return '';
}
if (filtered.length === 1) {
return filtered[0][1] || ''
} else {
return filtered.map((v) => {
return v[1] || ''
})
}
} else {
return result.reduce((rs, next) => {
return {
[next[0]]: next[1],
...rs
}
}, {})
}
} 不知道哪里出了问题,75%的用例通过,大佬们帮忙看下呗
function getUrlParam(sUrl, sKey) {
let params = sUrl.split('#')[0].split("?")[1] // 获取参数
if(sKey) { // 如果指定了参数
let tar = params.split('&');
let arr = []
for(let i =0;i<tar.length;i++) {
let flag = tar[i].includes(sKey);
if(flag) {
arr.push(tar[i])
}
}
if(arr.length>0) {
let array = [];
for(let i=0;i<arr.length;i++) {
let data = arr[i].split('=')[1]
array.push(data)
}
return array
}else{
return ''
}
} else{
if(params == '' || params == undefined) {
return {}
} else{
let res = {}
let target = params.split('&');
for(let i =0; i<target.length;i++) {
let temp = target[i].split('=')
if(!(temp[0] in res )) {
res[temp[0]] = []
}
res[temp[0]].push(temp[1])
}
return res
}
}
} function getUrlParam(sUrl, sKey) {
sUrl = sUrl.replace(/.{0,}\?|\#.{0,}/g, '').replace(/&/g, ' ')
if (sKey) {
const list = []
sUrl.replace(
new RegExp(`(${sKey})=(\\S)`, 'g'),
(p1, p2, p3) => list.push(p3)
)
return list.length ? (list.length === 1 ? list[0] : list) : ''
} else {
const obj = {}
console.log(sUrl)
sUrl.replace(
/(\S{0,})=(\S{0,})/g,
(p1, p2, p3) => obj[p2] = obj[p2] ? [].concat(obj[p2], p3) : p3
)
return obj
}
}
function getUrlParam(sUrl, sKey) {
// 拆分参数数组['key=1','key=2','key=3','test=4']
const urlStrArray = sUrl.split('?')[1].split('#')[0].split('&');
// 参数对象
const searchObj = {};
urlStrArray.forEach(item=>{
// 按等号拆分每个参数,获取key和value
const oneArray = item.split('=')
const key = oneArray[0]
const value = oneArray[1]
// 如果参数对象中已经有该key,说明参数名重复
if(searchObj.hasOwnProperty(key)) {
const oldValue = searchObj[key]
// 如果存储的值为字符串,则改为数组,将新值存入
if(typeof oldValue === 'string'){
searchObj[key] = [oldValue, value];
}else{
// 否则说明已经重复过,该值是一个数组,直接push新值
searchObj[key].push(value)
}
}else{
// 参数名未出现过,直接存入
searchObj[key]=value
}
})
// 指定参数名称查询,返回参数值,参数不存在时返回空字符串
if(sKey){
return searchObj[sKey]?searchObj[sKey]:''
}else{
// 不指定直接返回所有参数
return searchObj
}
} function getUrlParam(url, wd) {
const str = url.substring(24, url.length - 5).trim();
const arr = str.split("&");
let arr1 = [];
let arr2 = []
for (let i = 0; i < arr.length; i++) {
arr1[i] = arr[i].split("=")
}
arr1.forEach(element => {
for (let i = 0; i < element.length; i++){
if (element[i] === wd) {
arr2 = element[i+1];
}
}
})
return arr2;
}
// 为什么不能提交啊, function getUrlParam(sUrl, sKey) {
if (!sUrl) {
return
}
let result = [] // 保存有key的结果
let noKeyResult = {} // 保存没有key的结果
// 改造成key=1&key=2&key=3&test=4#hehe
sUrl = sUrl.split('?')[1]
if (sUrl.indexOf('#') != -1) {
// 改造成key=1&key=2&key=3&test=4
sUrl = sUrl.split('#')[0]
}
// 改造成[key=1,key=2,key=3,test=4]
sUrl = sUrl.split('&')
// 改造成[{key:1},{key:2},{key:3},{test:4}]
sUrl.forEach((v, i) => {
v = v.split('=')
key = v[0] // key key key test
value = v[1] // 1 2 3 4
// 对有传入key的进行处理
if (sKey === key) { // 如果key和传入的skey相同,则放入有skey的数组
result.push(value)
}
// 对没有传入key的进行处理
if (!noKeyResult[key]) { // 如果匹配到该key是第一次出现,则需要在对象中创建该属性,且值为一个数组
noKeyResult[key] = [value]
} else {
noKeyResult[key].push(value) // 如果存在,则直接添加数据即可
}
})
// 没有skey的情况
if (!sKey) {
return noKeyResult
} else {
// 有sKey的情况
if (result.length > 1) {
return result
} else {
// 需要特别注意的是当skey虽然存在但没有匹配到URL中任何一个参数的时候,需要返回一个空字符串
return result[0] || ''
}
}
}
function getUrlParam(sUrl, sKey) {
var parmas = new URL(sUrl).search.split('?')[1].split('&')
var obj = {}
for (var i = 0; i < parmas.length; i++) {
var [key, value] = parmas[i].split('=')
if (obj[key] === undefined) {
obj[key] = value
} else {
obj[key] = [].concat(obj[key], value)
}
}
return sKey === undefined ? obj : obj[sKey] || ''
}
function getUrlParam(sUrl, sKey) {
let parmsStr = sUrl.split('?').pop().split('#').shift()
let mapList = parmsStr.split('&').reduce((count, item) => {
let [key, value] = item.split('=')
if (count.hasOwnProperty(key) && !Array.isArray(count[key])) {
count[key] = [count[key], value]
} else if (count.hasOwnProperty(key) && Array.isArray(count[key])) {
count[key].push(value)
} else {
count[key] = value
}
return count
}, {})
if (!sKey) return mapList
return mapList[sKey] || ''
}