无法在此代码中定义正确的数组

时间:2019-02-20 07:33:04

标签: javascript

我需要帮助来组织节点红色的功能节点中的阵列。

当数据有效时(标志= A)...运行良好 当数据无效时(标志=否则)...错误分割。附加数组wifiAccessPoints(answer.wifiAccessPoints)不能像应该的那样进行拆分,例如:ssid,macAddress,signalStrength

下面只有四个wifiAccessPoints,但实际上可以更多。

// when flag = A

// IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#

// when flag = else

// IWAP01080524V0000.0000N00000.0000E000.1061830323.8706000908000102,460,0,9520,3671,主页| 74-DE-2B-44-88-8C | 97&Home1 | 74-DE-2B-44-88-8C | 97&Home2 | 74-DE-2B-44-88-8C | 97&Home3 | 74-DE-2B-44-88-8C | 97#

let answer = {}
let elements = msg.payload.replace('#','').split(",")                                                           // this gives an array containing the bits
// elements[0] is the long string starting IWAP01
answer.command = elements[0].substr(0,6)
let dateStr = elements[0].substr(6,6)                                                                           // eg "190215" 15th Feb 2019
answer.date = new Date(Number(dateStr.substr(0,2))+2000, Number(dateStr.substr(2,2))-1, dateStr.substr(4,2))    // 080524 - date
answer.valid = (elements[0].substr(12,1) === "A")                                                               // true or false - A or V
if (answer.valid) {
    let degreesN = Number(elements[0].substr(13,2))
    let minutesN = Number(elements[0].substr(15,7))
    let ns = elements[0].substr(22,1)                                                                           // N or S
    let degreesE = Number(elements[0].substr(23,3))
    let minutesE = Number(elements[0].substr(26,7))
    let ew = elements[0].substr(33,1)                                                                           // E or W
    node.warn(`${degreesN}  ${minutesN}  ${ns}  ${degreesE}  ${minutesE} ${ew}`)
    answer.latitude = degreesN + minutesN/60                                                                    // 2232.9806N
    if (ns === "S") answer.latitude = -answer.latitude
    answer.longitude = degreesE + minutesE/60
    if (ew === "W") answer.longitude = -answer.longitude                                                        // 11404.9355E
} else {
    answer.latitude = 0
    answer.longitude = 0
}

answer.speedMoving = elements[0].substr(34,5)                                                                   // 000.1
answer.angleDirection = elements[0].substr(45,6)                                                                // 323.87
answer.GSMsignal = elements[0].substr(51,3)                                                                     // 060
answer.satellites = elements[0].substr(54,3)                                                                    // 009
answer.batteryLevel = elements[0].substr(57,3)                                                                  // 080
// LBS datas
answer.mobileCountryCode = elements[1]                                                                          // 460
answer.mobileNetworkCode = elements[2]                                                                          // 0
answer.locationAreaCode = elements[3]                                                                           // 9520       
answer.cellId = elements[4]                                                                                     // 3671
// WIFI bases only with flag = else
//
// answer.wifiAccessPoints = elements[5]
//
answer.wifiAccessPoints = []
if (answer.valid === "else") {
    i = elements[4]+1                 // move on to wifi bases
    let wifiAccessPointsStrings = elements[5].split("&")
    let j;
    for (j=0; j<wifiAccessPointsStrings.length; j++) {
        let baseElements = wifiAccessPointsStrings[j].split("|")
        answer.wifiAccessPoints.push({ssid: baseElements[0], macAddress: baseElements[1], signalStrength: baseElements[2]})  // Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97
    }
}

msg.payload = answer
return msg

1 个答案:

答案 0 :(得分:0)

假设,主要问题是在这一行中检查'else'false的给定值

answer.valid = elements[0].substr(12, 1) === "A"

以供以后在此行中检查

if (answer.valid === "else") { // wrong, answer.valid contains a boolean

替换为

if (!answer.valid) {

,并通过省略未使用的赋值给未声明的值,

i = elements[4] + 1 // ns: i never used

它应该运行。

请测试结果并提供反馈。

function functionWithoutAnInterestingName(msg) {
    let answer = {}
    let elements = msg.payload.replace('#', '').split(",")                                                           // this gives an array containing the bits
    // elements[0] is the long string starting IWAP01
    answer.command = elements[0].substr(0, 6)
    let dateStr = elements[0].substr(6, 6)                                                                           // eg "190215" 15th Feb 2019
    answer.date = new Date(Number(dateStr.substr(0, 2)) + 2000, Number(dateStr.substr(2, 2)) - 1, dateStr.substr(4, 2))    // 080524 - date
    answer.valid = elements[0].substr(12, 1) === "A"                                                               // true or false - A or V
    if (answer.valid) {
        let degreesN = Number(elements[0].substr(13, 2))
        let minutesN = Number(elements[0].substr(15, 7))
        let ns = elements[0].substr(22, 1)                                                                           // N or S
        let degreesE = Number(elements[0].substr(23, 3))
        let minutesE = Number(elements[0].substr(26, 7))
        let ew = elements[0].substr(33, 1)                                                                           // E or W
        // ns: node does not exist!
        // node.warn(`${degreesN}  ${minutesN}  ${ns}  ${degreesE}  ${minutesE} ${ew}`)
        console.log(`${degreesN}  ${minutesN}  ${ns}  ${degreesE}  ${minutesE} ${ew}`)
        answer.latitude = degreesN + minutesN / 60                                                                    // 2232.9806N
        if (ns === "S") answer.latitude = -answer.latitude
        answer.longitude = degreesE + minutesE / 60
        if (ew === "W") answer.longitude = -answer.longitude                                                        // 11404.9355E
    } else {
        answer.latitude = 0
        answer.longitude = 0
    }

    answer.speedMoving = elements[0].substr(34, 5)                                                                   // 000.1
    answer.angleDirection = elements[0].substr(45, 6)                                                                // 323.87
    answer.GSMsignal = elements[0].substr(51, 3)                                                                     // 060
    answer.satellites = elements[0].substr(54, 3)                                                                    // 009
    answer.batteryLevel = elements[0].substr(57, 3)                                                                  // 080
    // LBS datas
    answer.mobileCountryCode = elements[1]                                                                          // 460
    answer.mobileNetworkCode = elements[2]                                                                          // 0
    answer.locationAreaCode = elements[3]                                                                           // 9520
    answer.cellId = elements[4]                                                                                     // 3671
    // WIFI bases only with flag = else
    //
    // answer.wifiAccessPoints = elements[5]
    //
    answer.wifiAccessPoints = []
    if (!answer.valid) {
        //i = elements[4] + 1       // ns: i never used          // move on to wifi bases
        let wifiAccessPointsStrings = elements[5].split("&")
        let j;
        for (j = 0; j < wifiAccessPointsStrings.length; j++) {
            let baseElements = wifiAccessPointsStrings[j].split("|")
            answer.wifiAccessPoints.push({ ssid: baseElements[0], macAddress: baseElements[1], signalStrength: baseElements[2] })  // Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97
        }
    }

    msg.payload = answer
    return msg
}

var a = 'IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#',
    b = 'IWAP01080524V0000.0000N00000.0000E000.1061830323.8706000908000102,460,0,9520,3671,Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97#';

console.log(functionWithoutAnInterestingName({ payload: a }));
console.log(functionWithoutAnInterestingName({ payload: b }));
.as-console-wrapper { max-height: 100% !important; top: 0; }