我在后端(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 }
]}
真实的是,我不知道如何实现这一目标......
答案 0 :(得分:1)
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);