2016-07-14 3 views
1

나는 블루투스를 통해 전송되는 데이터를 구독하고 파싱 한 다음 최종 정보를 출력 json으로 반환하는 함수를 작성하고 있습니다.메시지를 구문 분석하고 json을 반환하는 클리너 솔루션

내 메시지 형식은 '헤더', 'ID', 'Ggid', 'Ppayload', 'Ttimestamp', 'AsigA', 'BsigB'입니다. 이 형식에서는 각 세그먼트 사이에 공백이 없으며 하나의 쉼표가 있습니다. 이 형식에서는 ID와 헤더 만 필요합니다. 헤더는 정적이며 항상 'H'로 시작합니다. 다른 정보는 'Id'를 제외한 대문자로 시작됩니다. 예를 들어 Id 세그먼트는 12345678 일 수 있지만 페이로드 세그먼트는 P12345678입니다. 현재이 정보를 구문 분석하는 데 정말 복잡한 코드가 있습니다. , 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); 
        } 
       } 
      } 
     } 
    } 
} 

내가 자바 스크립트에서이 형식을 절단하는 일반적인 정규 표현식을 생각하고 H, 00198601, GLOCATE, P762, T1.50, A64,하지만 난 ':

예 메시지 문자열입니다 나는 그것에 익숙하지 않다. 그래서 정규식을 사용하지 않고 클리너 솔루션이 있습니까? 아니면 정규식을 사용해야하는 경우 어떻게 접근 할 수 있습니까? 코드를 기반으로

+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에 추가 할 정보가 더 있습니다. –

+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

그래, 첫번째 슬라이스 기능을 없애는 것이 좋다. –

관련 문제