项目里有一个地方要求用户填写的动参,原始格式为形如
“key1=value1
key2=value2
key3=value3″
的字符串
但是在接口提交时,需要将其转换为键值对{ key1: value1, key2: value2, key3: value3 }
然后从后台获取到这样的键值对时,在页面中要转换成原始格式的字符串用于回显。
想询问一下原生js有没有直观好用的方法把数据在这两种结构间相互转化
const originData = 'key1=value1\nkey2 =value2\n\nkey3==value3\nkey4' let resquestData = Object.assign({}, ...originData.split('\n').map(item => { if (item && item.includes('=')) { let arr = item.split('=') return { [arr[0].trim()]: arr[1]?.trim() } } })) let displayData = Object.keys(resquestData).map((item, index) => { return `${item}=${Object.values(resquestData)[index]}` }).join('\n') 上述代码是目前我的实现方法 但是有几个比较明显的问题,首先是我个人感觉可读性非常差; 其次是虽然对原始数据的一些错误格式进行了一定的处理, 但是总感觉这么复杂的表达式, 在面对一些意料外的输入时可能会导致报错从而导致页面的功能异常。 在此询问一下是否有可替代的更优解
模拟输入数据
const rawData = [ "key1=value1", "key2=value2", "key3=value3" ].join("\n");
转成对象,再处理成 JSON
const obj = Object.fromEntries( rawData.split(/[\r\n]+/) .map(line => line.split("=")) ); const json = JSON.stringify(obj); console.log(json); // {"key1":"value1","key2":"value2","key3":"value3"}
把 JSON 转换回来(解析成对象再处理成文本)
const text = Object.entries(JSON.parse(json)) .map(([key, value]) => `${key}=${value}`) .join("\n"); console.log(text); // key1=value1 // key2=value2 // key3=value3