在网上看到这样一组字符串处理,遂记录一下自己的解决方法,由于是初学者,解决方法不是最好的,只是记录我的思考过程。

1.要求

  • 输入:url: 'https://www.b.com?aaa=123&bbb=hhah&ccc=456'
  • 要求:将url中的参数解析并提取为对象
  • 输出: { aaa: "123", bbb: "hhah", ccc: "456" }

2.思考过程

url中之后的是需要提取出来的数据,然后将提取出来的数据,分别赋值给一个空对象。

function getUrlParams(url) {
  // 先根据indexOf获取?的索引
  const len = url.indexOf('?');
  // substr截取?之后的全部字符串
  const str = url.substr(len + 1);
  // 有三组数据,根据&,将其分割为数组中的三个字符串
  const arr = str.split('&');
  // 创建一个空对象,用于存放处理好的key:value
  let obj = {};
  // 通过循环的方式对arr中的字符串处理
  for (let key in arr) {
    // console.log(arr[key]);
    // l为=的索引
    let l = arr[key].indexOf('=');
    // k为将要传入obj对象中对应的key值
    let k = arr[key].slice(0, l);
    // v为将要传入obj对象中对应的value值
    let v = arr[key].slice(l + 1).toString();
    // 向空对象中添加属性
    obj[k] = v;
  }
  // console.log(obj);
  return obj
}
console.log(getUrlParams("https://www.b.com?aaa=123&bbb=hhah&ccc=456"))

最终打印出目标格式的对象。

3.如果url中有同一个参数的,不同属性,需要处理为如下格式

  • 输入:'https://www.b.com?aaa=123&bbb=hhah&ccc=456&ccc=789'
  • 输出:{ aaa: "123", bbb: "hhah", ccc: ["456", "789"] } 需要将同一个参数的属性值处理为数组字符串。
    这里解决方式就是要先判断一下url中是否存在同一个参数,如果存在,创建空数组,将同一个参数的属性值传入数组中。
  • 前面的处理都差不多,要多做一步判断是否重复
function getUrlSameParams(url) {
  const len = url.indexOf('?');
  const str = url.slice(len + 1);
  const arr = str.split('&');
  let obj = {};
  // 这里创建一个数组用来存放同参数的属性值
  let arrList = [];
  // 这里需要判断一下arr中是否有重复的参数,如果有,提取出参数的名称
  // 创建用于存放重复的字符串,这里只考虑只有一个重复的参数
  let repeatName = '';
  // 判断重复,并且提取出重复的值
  function repeat(arr) {
    let repeat_arr = [];
    for (let key in arr) {
      const repeat_l = arr[key].indexOf('=');
      const repeat_k = arr[key].slice(0, repeat_l);
      if (repeat_arr.includes(repeat_k)) {
        // console.log('有重复', repeat_k);
        repeatName = repeat_k
      } else {
        repeat_arr.push(repeat_k)
      }
    }
    // console.log(repeat_arr);
  }
  repeat(arr);
  // 这里循环处理对象中的属性
  for (let key in arr) {
    // console.log(arr[key])
    const l = arr[key].indexOf('=');
    const k = arr[key].slice(0, l);
    const v = arr[key].slice(l + 1)
    if (k === repeatName) {
      // 这里进行判断,当k等于重复的那个参数时,向数组内添加该参数的属性值
      arrList.push(v);
      obj[k] = arrList;
      // 将对象的value设置为空数组 
    } else {
      // 当k不是重复参数时,正常向对象中添加属性值 
      obj[k] = v;
    }
  }
  return obj
}
console.log(getUrlSameParams('https://www.b.com?aaa=123&bbb=hhah&ccc=456&ccc=789'))

最终输出目标格式