解析javascript字符串(键=值对的逗号分隔列表)的简洁方法是什么?

时间:2019-06-06 13:12:13

标签: javascript string

我正在尝试将字符串解析为JavaScript数组或映射。我要解析的字符串看起来像:

"{key1=value1, key2=value2, key3=value3}"

我目前拥有的代码有效,但是有点冗长。

str = "{key1=value1, key2=value2, key3=value3}";
str = str.replace(/{/g, '');
str = str.replace(/}/g, '');
var strMap = {};
str.split(', ').forEach(function(x) {
  var arr = x.split('=');
  strMap[arr[0]] = arr[1];
});

console.log(strMap)

这让我得到了想要的东西,但是不是很干净。有人建议我使用JSON.parse,但由于该字符串不是有效的JSON格式,因此似乎不起作用。

是否有一种简洁的方法可以使我不必手动解析字符串?

2 个答案:

答案 0 :(得分:1)

您可以用逗号和空格分隔字符串,并使用分隔符键/值对分隔新对象的属性。结果将字符串作为值。

program main
    implicit none
    integer i
    integer, parameter :: para1(*) = [1, 2, 3, 4, 5]
    integer, parameter :: para2(*) = [6, 7]
    integer, parameter :: N1 = size(para1), N2 = size(para2), N = max(N1, N2)
    integer, parameter :: params(N, 2) = &
            reshape( [ para1, (0, i = 1, N - N1), &
                       para2, (0, i = 1, N - N2) ], [N, 2] )

    print *, "para1 = ", params( :, 1 )
    print *, "para2 = ", params( :, 2 )

    print *, "Input i"
    read *, i
    print *, params( :, i )
end

$ gfortran-8 test.f90 && ./a.out

 para1 =            1           2           3           4           5
 para2 =            6           7           0           0           0
 Input i
1
           1           2           3           4           5

或者接受(即将到来的)Object.fromEntries

const getPair = ([k, v]) => ({ [k]: v });

var string = "{key1=value1, key2=value2, key3=value3}",
    result = Object.assign(...string
        .slice(1, -1)
        .split(/,\s+/)
        .map(p => getPair(p.split('=')))
    );

console.log(result);

答案 1 :(得分:-1)

您可以使用一些ES6功能轻松组合一个不错的天真解决方案(如示例中所示)。

const example = "{key1=value1, key2=value2, key3=value3}";
const stripped = example.substring(1, example.length - 1);
const map = stripped.split(",")
                    .map(pair => pair.trim())
                    .reduce((result, current) => {
                       const [key, value] = current.split("=");
                       return {
                          ...result,
                          key: value
                       };
                    }, {});