2016-07-14 55 views
1

我正在写一个函数来订阅通过蓝牙传输的数据并解析它,最后将特定的信息返回到输出json。我的邮件格式为'Header','Id','Ggid','Ppayload','Ttimestamp','AsigA','BsigB'。在这种格式下,每个分段之间没有空格,只有一个逗号。这种格式只需要标识和标题。标题是静态的,并始终以'H'开始。其他信息将以大写字母开头,“Id”除外。例如,Id段可以是12345678,但有效载荷段将是P12345678。目前,我有一个非常复杂的代码来解析这些信息。清理解析消息并返回json的解决方案

实施例的消息是一个字符串: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这种格式,但我我并不熟悉它。那么是否有没有使用正则表达式的更清洁的解决方案,或者如果我必须使用正则表达式,我该如何处理?

+1

你能提供你得到消息的样本? –

+1

您可以分享您的输入和预期输出的实际例子吗?你共享的代码似乎开始在中间的某个地方......就像你已经把逗号分割了,并删除了单引号?它也似乎从你的代码中,像你想剥离除ID以外的每个值的第一个字符? – smarx

+0

@smarx,是的,我已经用逗号分隔了原始字符串,我会马上添加示例消息。 –

回答

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" 
 
// }

+0

是的,我只是忘了映射领域。子串可能是我认为的最佳解决方案。 –

+0

@LingboTang'substring'和'slice'做同样的事情,'substring'在处理一些参数方面有一些不同。 – 4castle

+0

一个问题是你没有处理isLost的情况,但我现在添加了该块。 –

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); 
} 
+0

差不多这样做,但注意不同的属性在各种'if' – charlietfl

+1

对于len> = 4,我有更多的信息要添加在json上,而不仅仅是groupID –

+0

我编辑我的答案请看看 –

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);

+0

是的,有切片功能切断第一个是很好的。 –