在网上看到这样一组字符串处理,遂记录一下自己的解决方法,由于是初学者,解决方法不是最好的,只是记录我的思考过程。
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'))
最终输出目标格式