最近呢,很多培训完的小伙伴出来找工作,遇到了笔试题,觉得很难。有道题呢,很多人找我做过,是什么样子的题目呢?我们一起来看
var str1 = "http://test.com?foo=active@987df&key=123&key=78";
var str2 = "http://test.com?too=last@4567&key=555&value=test";
function show(){},让封装一个函数show
打印show(str1); //返回结果 {foo:'active',key:[123,78]}
打印show(str2); //返回结果 {too:'last',key:555,value:'test'}
首先,遇到这个问题,我们要想到一系列数组字符串API,将字符串用"?"分成一个数组,再看后边的部分,再用"&"分开,因为结果中的数字不能是字符串,我们还应当将得到的数字字符串转成number类型。
一句话,把这里边"="之前的作为对象的key,值都是一个数组,然后一个一个加,最后如果数组长度只有一个,就toString(),如果是数字,再Number
二话不说,上代码
function show(str) {
let s = str.split('?')[1]; //得到foo=active@987df&key=123&key=78
//再将s以&分开
let arr = s.split("&"); //得到数组['foo=active@987df', 'key=123', 'key=78']
//声明一个空对象来装键值对
let obj = {};
//遍历arr,将每一项'='前的放入对象作为key,后边放入数组
for (let j = 0; j < arr.length; j++) {
let char = arr[j].split("=")[0];
let charV = arr[j].split("=")[1];
if (obj[char] == undefined) {
//用数组装着
obj[char] = [];
//判断是否有@ 这是下边封的方法,用的三目运算符
obj[char].push(judge(charV) ? charV.split("@")[0] : charV)
} else {
obj[char].push(charV)
}
}
//遍历对象,如果值的长度为一,就转成字符串,不用数组
for (let k in obj) {
if (obj[k].length == 1) {
//判断是否转为数字不是NaN
//类似[555]这种
if (!isNaN(Number(obj[k][0]))) {
obj[k] = Number(obj[k].toString())
} else {
obj[k] = obj[k].toString()
}
} else {
for (let j in obj[k]) {
if (!isNaN(Number(obj[k][j]))) {
obj[k][j] = Number(obj[k][j])
}
}
}
}
return obj
}
//封装方法,判断字符串是否有@
function judge(str) {
//返回有没有@ ES6字符串新方法 includes 意思是包括的意思,加s可以理解成第三人称单数
return str.includes("@");
}
console.log(show(str1));
console.log(show(str2));