2016-07-14 84 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

是的,有切片功能切斷第一個是很好的。 –