首页 > 试题广场 >

获取 url 参数

[编程题]获取 url 参数
  • 热度指数:92252 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
获取 url 中的参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
4. 不支持URLSearchParams方法
示例1

输入

http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe key

输出

[1, 2, 3]
function getUrlParam(sUrl, sKey) {
        let index=sUrl.indexOf('?')
        let index2=sUrl.indexOf('#')
        let strArr=sUrl.substring(index+1,index2).split('&')
        let obj={}
        strArr.forEach(item => {
            let [key,value]=item.split('=')
            if(obj[key]){
                obj[key]=[].concat(obj[key],value);
            }else{
                obj[key]=value
            }
        })
        if(sKey===undefined||sKey==='') return obj
        if(obj.hasOwnProperty(sKey)){
            return obj[sKey]
        }else{
            return ''
        }


}
发表于 2022-08-23 13:17:15 回复(0)
function getUrlParam(sUrl, sKey) {
    var params = sUrl.split('?')[1].split('#')[0].split('&');
    var obj = {};

    params.forEach(el=>{
        if (Object.keys(obj).includes(el.split('=')[0])) {
            obj[el.split('=')[0]] = obj[el.split('=')[0]].concat(el.split('=')[1]);
        } else {
            obj[el.split('=')[0]] = [].concat(el.split('=')[1]);
        }   
    });

    if(sKey){
        if(!obj[sKey]){
            return ''; 
        }else{
            switch(obj[sKey].length){
                case 1:
                    return obj[sKey][0];
                    break;
                default:
                    return obj[sKey];
                    break;
            }
        }
    }else{
        return obj;
    }
}

发表于 2022-02-14 15:56:55 回复(0)
function getUrlParam(sUrl, sKey) {
    let obj = {}
    sUrl = sUrl.split('#')[0]
    let arr1 = sUrl.split('?')
    if(arr1[1]){
        let arr2 = arr1[1].split('&')
        arr2.forEach(item => {
            let arr3 = item.split('=')
            if(obj.hasOwnProperty(arr3[0])){
                if(Array.isArray(obj[arr3[0]])){
                    obj[arr3[0]].push(arr3[1])
                }
                else{
                    obj[arr3[0]] = [obj[arr3[0]],arr3[1]]
                }
            }
            else{
                if(arr3[1]){
                    obj[arr3[0]] = arr3[1]
                }
                else{
                    obj[arr3[0]] = ''
                }
            }
        })
    }
    else{
        return ''
    }
    if(sKey){
        if(obj.hasOwnProperty(sKey)){
            return obj[sKey]
        }
        else{
            return ''
        }
    }
    else{
        return obj
    }
}
发表于 2022-02-11 17:03:03 回复(0)
function getUrlParam(sUrl, sKey) {
     if (sKey !== undefined)
            return sUrl.match(new RegExp(`(?<=(\\??${sKey}=))[^&]`, 'g')).map(v => +v)
        const obj = {}
        const match = sUrl.match(/\w+=\w+/g);
        for (const item of match) {
            const [key, value] = item.split('=')
            obj[key] = value
        }
        return obj
}
发表于 2022-01-14 13:14:49 回复(0)
      function getUrlParam(sUrl, sKey) {
        let arr = [];
        let obj = {};
        let query = sUrl.split("?")[1].split("#")[0].split("&");
        for (e of query) {
          e = e.split("=");
          let [key, value] = e;
          if (sKey && key === sKey) {
            arr.push(value);
          }
          if (!sKey) {
            if (key in obj) {
              obj[key] = [].concat(obj[key], value);
            } else {
              obj[key] = value;
            }
          }
        }
        // 判断返回类型
        // if (!sKey) {
        //   return obj;
        // } else {
        //   if (!arr.length) {
        //     return "";
        //   } else if (arr.length === 1) {
        //     return arr[0].toString();
        //   } else {
        //     return arr;
        //   }
        // }

        // 三元运算符判断类型
        return !sKey
          ? obj
          : !arr.length
          ? ""
          : arr.length > 1
          ? arr
          : arr[0].toString();
      }
发表于 2022-01-13 20:17:22 回复(0)
可算搞定了,题目需求给得不够详细
function getUrlParam(sUrl, sKey) {
    let index0=sUrl.indexOf("?");
    if (index0!==-1) {
        //保留?后面的
        sUrl=sUrl.slice(index0+1);
        if (sUrl.length===0  || sUrl.indexOf("=")===-1) {
            //无法解析时
            return sKey===undefined ? {} : "";
        }
        let index1=sUrl.indexOf("#");
        if (index1!==-1) {
            //去除#及其后面的内容
            sUrl=sUrl.slice(0,index1);
        }
    }else{
        //如果不存在任何参数
        return sKey===undefined ? {} : "";
    }

    sUrl=sUrl.split("&");

    let result={};

    sUrl.forEach((item)=>{
        item=item.split("=");
        if (item.length>1) {
            if (result[item[0]]!==undefined) {
                result[item[0]]=result[item[0]].concat([item[1]]);
            }else{
                result[item[0]]=[item[1]];
            }
        }else{
            if (result[item[0]]!==undefined) {
                result[item[0]]=result[item[0]].concat([""]);
            }else{
                result[item[0]]=[""];
            }
        }
    });

    if (sKey===undefined) {
        return result;
    }else{
        if (result[sKey]!==undefined) {
            if (result[sKey].length>1) {
                return result[sKey]
            }else{
                return result[sKey][0];
            }
        }else{
            return "";
        }
    }

}

let str1="http://www.nowcoder.com?key=1&key=2&key=3&key=4&test=4#hehe";
let result=getUrlParam(str1,"key");
console.log(result);


发表于 2022-01-01 15:26:32 回复(0)
function getUrlParam(sUrl, sKey) {
    var keyArr = sUrl.split('?')[1].split('#')[0].split('&')
    var keyObj = {}
    for (var item of keyArr) {
        var [i, j] = item.split('=')
        if (!keyObj[i]) keyObj[i] = j
        else keyObj[i] = [...keyObj[i], j]
    }
    return !sKey ? keyObj : keyObj[sKey] || ''
}

发表于 2021-12-30 10:09:04 回复(0)
/* 
  描述
  获取 url 中的参数
  1. 指定参数名称,返回该参数的值 或者 空字符串
  2. 不指定参数名称,返回全部的参数对象 或者 {}
  3. 如果存在多个同名参数,则返回数组
  4. 不支持URLSearchParams方法
*/


function getUrlParam(sUrl, sKey) {
  // // 分割字符串成数组,需要注意的是 # 后的字符串不属于参数
  // const start = sUrl.indexOf('?')
  // const end = sUrl.indexOf('#') < 0 ? sUrl.length : sUrl.indexOf('#')
  // // 处理url中没有参数的情况
  // if (start === -1) {
  //   return '该url中没有参数'
  // }
  // // 裁剪参数字符串,比如像 key=1&key=2&key=3&test=4
  // const paramsStr = sUrl.slice(start + 1, end)
  // // 分割成Array[array], 比如像 [ [ 'key', '1' ], [ 'key', '2' ], [ 'key', '3' ], [ 'test', '4' ] ]
  // const sArr = paramsStr.split('&').map(s => s.split('='))

  // 处理url中没有参数的情况
  if (!sUrl.split('?')[1]) {
    return '该url中没有参数'
  }

  const sArr = sUrl.split('?')[1].split('#')[0].split('&').map(s => s.split('='))
  const obj = {} // 用于存放参数

  for (const [prop, value] of sArr) {
    // 因为对象的key可能会重复,会覆盖掉之前相同key的值,根据对象key唯一性,使用数组来存储
    if (!obj[prop]) {
      obj[prop] = [value]
    } else {
      obj[prop].push(value)
    }
  }

  for (key in obj) {
    // 处理长度为1的key,使其恢复 key: value 的格式
    obj[key].length === 1 && (obj[key] = obj[key][0])
  }

  if (sKey && obj[sKey]) {
    // 指定参数名称且在url中找到该参数有值
    return obj[sKey]
  } else if (sKey && !obj[sKey]) {
    // 指定参数名称但是在url中找不到该参数
    return ''
  } else {
    // 不指定参数名称则返回url中所有的参数
    return obj
  }
}

// test
// const sKey = 'helloworld'
// const sUrl = 'http://www.nowcoder.com/'
const sUrl = 'http://www.nowcoder.com?key=1&key=2&key=3&test=4#here'
const sKey = ''
console.log('运行结果: ', getUrlParam(sUrl, sKey))

发表于 2021-12-28 16:33:28 回复(0)
// 这个采用了类型判断的方式来处理,当遇见重复的 key 的问题
// 当检测到重复的时候 并且 类型还是 string 的时候把当前值改为 [原来的值和,第二次值]
// 再进来就是数组了然后直接 push 
// 貌似风险更低
function getUrlParam(url, sKey) {
    let startIndex = url.indexOf("?");
    let endIndex = url.indexOf("#");
    let str = url.substring(startIndex + 1, endIndex);
    let arr = str.split("&");
    //
    let ret = {};
    arr.forEach((item) => {
        let [key, val] = item.split("=");
        // 当前对象中不存在重复的值
        if (ret[key] === undefined) {
            ret[key] = val;
        } else {
            // 如果是string 就变成数组
            if (typeof ret[key] === "string") {
                // 原来的值与当前的值合并成一个数组
                ret[key] = [ret[key], val];
            } else if (Array.isArray(ret[key])) {
                ret[key].push(val);
            }
        }
    });
    return sKey ? ret[sKey] || "" : ret;
}

发表于 2021-12-22 00:29:07 回复(0)
function getUrlParam(sUrl, sKey) {
            var param=sUrl.split("#")[0].split("?")[1].split("&");
            if(sKey){
            for(var i in param){
                var arrs=new Object();
                var tmp=param[i].split("=");
                if(tmp[0]=sKey){
                    arrs.push=tmp[1]
                }
            }
            if(arrs.length==1){
                return arrs[0]
            }
            else if(arrs.length==0){
                return "";
            }
            else {
                return arrs;
            }
        }
        else {//不指定参数名称,返回全部的参数对象 或者 {}
        if(param == undefined || param == ""){
            return {};
        } else {
            var arrObj = new Object();
            for(var i in param){
                var tmp = param[i].split('=');
                if (!(tmp[0] in arrObj)) {
                    arrObj[tmp[0]] = [];
                }
                arrObj[tmp[0]].push(tmp[1]);              
            }
            return arrObj;
        }
    }
}
发表于 2021-11-11 14:54:30 回复(0)
function getUrlParam(sUrl, sKey = "") {
      let reg = /[?&](.+)[&#]/i
      let matchedGroup = sUrl.match(reg)
        
      if(!sKey){  
           let arrOfValues = matchedGroup[1].split('&').map(item=>{
             let [key,value] = item.split("=")
             return value
           })   
           
          return {
              key: [...new Set(arrOfValues)]
          } 
      } else {
          let arrOfValues = matchedGroup[1].split('&').map(item => {
              let [key,value]= item.split('=')
              if(key === sKey){
                  return value
                 } else {
                     return undefined
                 }
              }    
          )
          
          
          let filtered = arrOfValues.filter(item => item!== undefined)
          if(filtered.length === 0){
              return ""
          } else if(filtered.length === 1) {
              return filtered.toString()
          } else {
              return filtered
          }
              
      }     
}

发表于 2021-11-04 00:12:56 回复(0)
function getUrlParam(sUrl, sKey) {
   var str = sUrl.slice(sUrl.indexOf('?')+1,sUrl.length)
   		str = str.slice(0,str.indexOf('#'))
   		str = str.split('&')
   		var a=[];
   		for(var i=0; i<str.length; i++){
   			// console.log(str[i])
   			if (str[i].indexOf(sKey) !== -1 && !sKey) {
   				a.push(parseInt(str[i].split('=')[1]))
   			}else {
   				a.push(parseInt(str[i].split('=')[1]))
   			}
   		}
   		return a;
   
}

不通过啊

发表于 2021-10-20 16:35:04 回复(0)
不用正则
function getUrlParam(sUrl, sKey) {
    let para=sUrl.split("?")[1].split("#")[0].split("&")
    const obj={}
    for(let i=0;i<para.length;i++){
        let key=para[i].split('=')[0]
        let value=para[i].split("=")[1]
        if(!obj[key]){ 
                     obj[key]=value
                     }
        else{  
            obj[key]=[].concat(obj[key],value)
            
            }
        
    }
    return   !sKey?obj :obj[sKey]||""
    
}

发表于 2021-09-17 11:46:12 回复(0)
function getUrlParam(sUrl, sKey) {
    let params = sUrl
    .split("?")[1]
    .split("#")[0]
    .split("&")
    .reduce((acc, cur) => {
        let [key, value] = cur.split("=");
        acc[key] = acc[key] ? [...acc[key], value] : value;
        return acc;
    }, {});

    if (sKey) {
        return params[sKey] || "";
    } else {
        return params || {};
    }
}

发表于 2021-09-13 16:18:14 回复(0)
function getUrlParam(sUrl, sKey) {
    let obj = {}                                                                            
    for (let i of sUrl.match(/\w+(=\w)/g)) {    //遍历出所有的参数                                            
        let o = i.match(/^\w+/)[0]              //保存参数名                                           
        obj[o] ? obj[o].push(i.match(/\w+$/)[0]) : obj[o] = [i.match(/\w+$/)[0]]            
    }   //判断是否已存在该属性,如果不存在直接添加,如果存在则push进去                                                                                    
    return !sKey ? obj : !obj[sKey] ? '' : obj[sKey].length > 1 ? obj[sKey] : obj[sKey][0]          
}  //判断是否有传入sKey,如果没有返回obj,如果有sKey再判段该属性是否只有一个值,如果有多个值返回数组,如果只有一个值返回字符串

发表于 2021-09-12 16:50:53 回复(0)