js如何实现将'a=b'格式的字符串与键值对的相互转换?


项目里有一个地方要求用户填写的动参,原始格式为形如

"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')


上述代码是目前我的实现方法
但是有几个比较明显的问题,首先是我个人感觉可读性非常差;
其次是虽然对原始数据的一些错误格式进行了一定的处理,
但是总感觉这么复杂的表达式,
在面对一些意料外的输入时可能会导致报错从而导致页面的功能异常。
在此询问一下是否有可替代的更优解

阅读 2.5k
5 个回答

模拟输入数据

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

数据合规的话直接 \n 按行切割,每行在用 = 切割,且限定只能由 2 个元素,然后用 Object.fromEntries 转成对象。

const data = `key1=value1
key2=value2
key3=value3`


const result = Object.fromEntries(data.split('\n').map(v => v.split('=', 2)))

console.log(result);

楼上 唯一丶 是字符串转js对象
我这个是js对象转字符串


let str = Object.entries({ key1: 'value1', key2: 'value2', key3: 'value3' }).map(([key,val])=>`${key}=${val}`).join('\n');
// 'key1=value1\nkey2=value2\nkey3=value3'

image.png
使用常规一点的reduce

  const str = 'key1=value1\nkey2=value2\nkey3=value3';

  const result = str.split('\n').reduce((obj, item) => {
    const [key, value] = item.split('=');
    obj[key] = value;
    return obj;
  }, {});

  console.log(result);
function transform(value) {
    switch (Object.prototype.toString.call(value)) {
        case "[object String]":
            var match, obj = {}, reg = /\s*(\S+)\s*=\s*(\S+)\s*/g;
            while (match = reg.exec(value)) obj[match[1]] = match[2];
            return obj;
        case "[object Object]":
            var arr = [];
            for (var key in value) arr.push(key + "=" + value[key]);
            return arr.join("\n");
    }
}
console.log(transform(`
    key1=value1
    key2=value2
    key3=value3
`));
console.log(transform({
    key1: "value1",
    key2: "value2",
    key3: "value3"
}));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏