前几天,一个后端笑眯眯的把我叫过去,说 “这个参数你自己解析一下,我这边不好解析” ,作为一个新人,我毅然决然的接下了这个活,看了一下那个模版内容,长这样 {foo1000_soft:"11",foo1_sn:"2",foo2_soft:"3.1",foo2_sn:"4"} 此时我还不知道会发生什么。
一开始,我以为十分轻松,加了一个JSON.parse(),发现,怎么没反应呢,也不报错,看来看去,发现这个字符串不大对劲,我用JSON.stringfy()生成了一个对象JSON看了一下,发现名字是带双引号的,当场裂开,也没多想,直接用数组和字符串的api解决了问题,比较笨,代码如下
const getBatteryInfo = (originInfoStr) => {
const oriInfo = formatBatteryInfo(originInfoStr);
let batterySN = '';
let batterySoftVersion = '';
if (oriInfo || oriInfo === '') {
return { batterySN, batterySoftVersion };
}
for (let i = 1; i <= 3; i++) {
batterySN += oriInfo[`foo${i}_sn`] ? oriInfo[`foo${i}_sn`] : '';
batterySoftVersion += oriInfo[`foo${i}_soft`]
? oriInfo[`foo${i}_soft`]
: '';
}
return { batterySN, batterySoftVersion };
};
const formatBatteryInfo = (originInfoStr) => {
if (originInfoStr || originInfoStr == '') {
return '';
}
let kvList = originInfoStr.split('{')[1].split('}')[0].split(',');
let res = [];
kvList.map((item) => {
let kv = item.split(':');
res.push(`"${kv[0]}":${kv[1]}`);
});
return JSON.parse(`{${res.join(',')}}`);
};
就是首先去掉花括号,然后根据逗号分割取值(捂脸),后来我想起来做笔试题时,有的笔试传进来的是个数组字符串,我也是这么处理的,感觉很笨hhh,上网研究了一下,发现好像可以用正则处理一下,于是代码可以简化为
const str = `{foo1000_soft:"11",foo1_sn:"2",foo2_soft:"3.1",foo2_sn:"4"}`;
const kvList = str.match(/foo\d+_(soft|sn):"([0-9]+|[0-9]+.[0-9]+)"/g);
const oriJSON = {};
kvList.map((item) => {
oriJSON[item.match(/foo\d+_(soft|sn)/)[0]] = Number(
item.match(/(?<=")([0-9]+|[0-9]+.[0-9]+)?(?=")/)[0]
);
});
console.log(oriJSON);// { foo1000_soft: 11, foo1_sn: 2, foo2_soft: 3.1, foo2_sn: 4 }
写的时候到处搜索了好久(我的正则太菜了),然后中途有发现可以使用eval进行一个转译
const str = `({foo1000_soft:"11",foo1_sn:"2",foo2_soft:"3.1",foo2_sn:"4"})`;
console.log(eval(str));// { foo1000_soft: '11', foo1_sn: '2', foo2_soft: '3.1', foo2_sn: '4' }
这样写比较优雅(手动狗头),然后我发现以前的数组字符串也能这么转
const str = '[1,2,3,4,5]';
console.log(eval(str)); // [ 1, 2, 3, 4, 5 ]
tips: eval转译对象如果遇到问题,有可能是没有使用
()将花括号包裹起来,像这样({})
不过有看到博客上说严格模式下eval会失效,不过我还遇到过严格模式下无法使用正则表达式的情况,那不是只能用我第一种的转法了.....
如果还有更好的转换方法,欢迎补充