我正在编写一个函数来订阅通过蓝牙传输数据并解析它,最后将特定信息返回到输出json。
我的邮件格式为'标题' ID'' Ggid'' Ppayload'' Ttimestamp&# 39;,' AsigA'' BsigB&#39 ;.在这种格式中,每个段之间没有空格,只有一个逗号。此格式只需要Id和Header。标题是静态的,并且始终以' H开头。除了' Id'之外,其他信息将以大写字母开头。例如,Id段可以是12345678,但有效载荷段将是P12345678。目前,我有一个非常复杂的代码来解析这些信息。
示例消息是一个字符串:H,00198601,GLOCATE,P762,T1.50,A64,B67
var len = Message.length;
app.outputTagJson.Tag = {};
if (len >= 2)
{
app.outputTagJson.Tag.tagID = Message[1];
app.outputTagJson.Tag.isLost = "False";
if (len >= 3)
{
app.outputTagJson.Tag.groupID = Message[2].slice(1,Message[2].length);
if (len >= 4)
{
app.outputTagJson.Tag.payload = Message[3].slice(1,Message[3].length);
if (len >= 5)
{
app.outputTagJson.Tag.timeStamp = Message[4].slice(1,Message[4].length);
if (len >= 6)
{
app.outputTagJson.Tag.sigStrenthA = Message[5].slice(1,Message[5].length);
if (len >= 7)
{
app.outputTagJson.Tag.sigStrenthB = Message[6].slice(1,Message[6].length);
}
}
}
}
}
}
我正在考虑使用通用正则表达式在javascript中删除此格式,但我并不熟悉它。那么有没有使用正则表达式的清洁解决方案,或者如果我必须使用正则表达式,我该如何处理?
答案 0 :(得分:2)
试一试?
var input = 'H,00198601,GLOCATE,P762,T1.50,A64,B67';
var fieldMap = {
G: 'groupID',
P: 'payload',
T: 'timeStamp',
A: 'sigStrengthA', // NOTE: you misspelled "strength"
B: 'sigStrengthB',
};
var fields = input.split(',');
var tag = {};
tag.tagID = fields[1];
fields.slice(2).forEach(function (field) {
tag[fieldMap[field[0]]] = field.substring(1);
});
console.log(JSON.stringify(tag, null, 4));
// Output:
// {
// "tagID": "00198601",
// "groupID": "LOCATE",
// "payload": "762",
// "timeStamp": "1.50",
// "sigStrengthA": "64",
// "sigStrengthB": "67"
// }

修改强>
另一种纯粹依赖于字段顺序的解决方案(现在我看到字段总是以相同的顺序):
var input = 'H,00198601,GLOCATE,P762,T1.50,A64,B67';
var fieldNames = [
'tagID',
'groupID',
'payload',
'timeStamp',
'sigStrengthA',
'sigStrengthB',
];
var tag = {};
var fields = input.split(',');
for (var i = 1; i < fields.length; i++) {
tag[fieldNames[i-1]] = fields[i].substring(i === 1 ? 0 : 1);
}
console.log(JSON.stringify(tag, null, 4));
// Output:
// {
// "tagID": "00198601",
// "groupID": "LOCATE",
// "payload": "762",
// "timeStamp": "1.50",
// "sigStrengthA": "64",
// "sigStrengthB": "67"
// }
&#13;
答案 1 :(得分:2)
这可能是一个很好的机会,可以使用这样一个事实:在switch
语句中,它会一直执行下面的语句,直到它达到break
。此外,当您没有指定第二个参数时,slice
会结束。
var input = "H,00198601,GLOCATE,P762,T1.50,A64,B67",
message = input.split(","),
tag = {};
switch (message.length) {
default:
case 7: tag.sigStrengthB = message[6].slice(1);
case 6: tag.sigStrengthA = message[5].slice(1);
case 5: tag.timeStamp = message[4].slice(1);
case 4: tag.payload = message[3].slice(1);
case 3: tag.groupID = message[2].slice(1);
case 2: tag.tagID = message[1];
tag.isLost = "False";
case 1:
case 0: break;
}
console.log(tag);
&#13;
答案 2 :(得分:0)
根据你的代码(我不确切知道它是什么),它可以像这样重写:
var len = Message.length;
var props = ['tagID','groupID','payload','timeStamp','sigStrenthA','sigStrenthB'];
app.outputTagJson.Tag = {};
if (len >= 2)
{
app.outputTagJson.Tag[props[0]] = Message[1];
app.outputTagJson.Tag.isLost = "False";
for(var i=3;i<=len;i++)
app.outputTagJson.Tag[props[i-2]] = Message[i-1].slice(1,Message[i-1].length);
}