Node.js将字符串转换为JSON

时间:2014-08-23 18:21:00

标签: json string node.js algorithm

我在后端(nodejs)收到一个这种格式的字符串:

t0=16,21,32,8$t1=15,33,46,4$t2=26,27,37,5$t3=9,29,40,8

我需要将它转换为具有以下格式的JSON对象:

{"bets":[
    {"n1":16, "n2":21, "n3":32,"s1":8 }, 
    {"n1":15, "n2":33, "n3":46,"s1":4 },
    {"n1":26, "n2":27, "n3":37,"s1":5 },
    {"n1":9, "n2":29, "n3":40,"s1":8 }
]}

真实的是,我不知道如何实现这一目标......

3 个答案:

答案 0 :(得分:1)

使用String.prototype.split

字符串的

split方法允许您通过分隔符将字符串“拆分”为数组。举个例子:

'1,2,3'.split(','); // => [1,2,3]

使用split回答您的问题:

var string = 't0=16,21,32,8$t1=15,33,46,4$t2=26,27,37,5$t3=9,29,40,8';
var obj = {
  bets: []
};
string.split('$').forEach(function(x) {
  var o = {n1: '', n2: '', n3: '', s1: ''};
  x.split(',').forEach(function(y, index) {
    o[index < 3 ? 'n' + (index+1) : 's1'] = index == 0 ? +y.slice(3) : +y;
  });
  obj.bets.push(o);
})

Lemme解释代码,起初看起来可能很复杂。

首先我们将字符串拆分为$,这是我们尚未下注的分隔符,然后我们将每个部分拆分为,,以便得出我们的数字。

现在[index < 3 ? 'n' + (index+1) : 's1']发生了什么?

这是一个内联if / else语句,如果您不熟悉它们,请查看this

它的作用是:检查我们是否在数组的第三个元素,如果是,则将键设置为s1,否则,键将为'n' + (index+1),这将导致n1 {1}}在0索引处等等。

我们的价值中有另一个内联if语句,那是什么?我们的第一个元素不仅仅是一个数字,它将类似t0=16,但我们只需要数字,所以我们检查我们是否在第一个元素,如果是,则切断字符串。

+y将我们的字符串转换为整数/浮点数,它与调用parseInt()类似,只有一些小差异。

答案 1 :(得分:1)

您可以通过使用split和reduce来实现此目的:

    var data = 't0=16,21,32,8$t1=15,33,46,4$t2=26,27,37,5$t3=9,29,40,8'.split('$');

    var result = data.reduce(function (mem, curr) {
        var d = curr.split(',');

        mem.bets.push({
            "n1": +d[0].replace(/t\d+=/, ''),
            "n2": +d[1],
            "n3": +d[2],
            "n4": +d[3]
        });

        return mem;
    }, {"bets": []});

答案 2 :(得分:0)

使用String.prototype.split()和一些基本正则表达式的组合

var input = 't0=16,21,32,8$t1=15,33,46,4$t2=26,27,37,5$t3=9,29,40,8';
var objs = input.split('$');

var result = { bets: [] };
var re = /^t[0-9]+=([0-9]+),([0-9]+),([0-9]+),([0-9]+)$/i;
for (var i in objs) {
  var matches = re.exec(objs[i]);
  result.bets.push({
    "n1": matches[1],
    "n2": matches[2],
    "n3": matches[3],
    "s1": matches[4]
  });
}

console.log(result);