js分割url参数并转换为对象(包含数字,数组,null等情况)

347 阅读1分钟

最近刷到了这道题,由于时间不够(能力不够)没做出来,现在重新做了一下

function splitUrl(url){
  const params = {}
  let temp = url.split("?")
  if(temp.length<2){
    return {}
  }
  let urls = temp[1].split('&')
  urls.forEach(item=>{
    // 处理一下 https://juejin.cn?abc 的情况
    if(!item.includes('=')){
      return params
    }
    // 将key与value分隔开
    let temp = item.split('=')
    let key,value
    if(temp.length<2){
      key = temp[0]
      value = ''
    }else {
      key = temp[0]
      value = temp[1]
    }
    // 判断是否是数字
    if(checkNum(parseFloat(value),value)){
      value = parseFloat(value)
    }else if(['true','false','undefined','null'].includes(value)){
      // 判断是否是boolean,undefined,null等
      if('true'===value){
        value = true
      }
      else if('false'===value){
        value = false
      }
      else if('undefined'===value){
        value = undefined
      }
      else if('null'===value){
        value = null
      }
    }
    // 判断是否是数组
    if(key in params){
      if(params[key].push){
        params[key] = [...params[key],value]
      }else{
        params[key] = [params[key],value]
      }
    }else{
      params[key] = value
    }
  })
  return params
}
function checkNum(num,str){
  let newNum = num
  let newStr = str
  // 判断一下isNaN的情况
  if(isNaN(num)){
    return false
  }
  // 判断一下负数的情况
  if(newStr.startsWith('-')&&newStr.split('-').length==2){
    newStr = newStr.replace('-','')
    newNum = -newNum
  }
  // 判断一下小数的情况
  if(newStr.includes('.')){
    let newStrArray = newStr.split('.')
    if(newStrArray.length>2){
      return false
    }
    // 分开判断小数点前和小数点后是否都是数字
    if(!checkNum(parseInt(newStrArray[0]),newStrArray[0])||!checkNum(parseInt(newStrArray[1]),newStrArray[1])){
      return false
    }else{
      return true
    }
  }
 
  let count = 1
  while(newNum>=10){
    newNum/=10
    count++
  }
  if(count===newStr.length){
    return true
  }else{
    return false
  }
}

let res = splitUrl("http://localhost:8000/#/pages/order/receipt/receiptRisk?id=YH-HS-2023022430767&grid=131175352&grid=-131175352&grid=-131175352.asd&grid=asda13das1175352&title=HS%E6%A1%83%E5%9F%8E%E5%B0%9A%E5%93%81%E6%9E%97%E6%BA%AA%E4%BA%8C%E6%9C%9FHWFSF-6%E8%AE%BE%E5%A4%87%E8%B6%85%E9%A2%91&topOrderId=YH-HS-2023022430767&topRiskType=OLIN&cableInOutBaseline=undefined&standardWaveOutput=undefined&topTaskType=risk&speciality=%E6%97%A0%E7%BA%BF%E7%BD%91&topOrderClearTime=null")

console.log(res);