Home > Enterprise >  javascript parse string and check with conditional logic
javascript parse string and check with conditional logic

Time:01-01

If I have data that looks like this

const reqObjects = {
    "VAV1": "read 12345:2 analogInput 2",
    "VAV2": "read 12345:3 analogInput 1",
    "VAV3": "read 12345:4 analogInput 1",
    "VAV4": "read 12345:5 analogInput 2",
    "VAV5": "read 12345:6 analogInput 1",
    "VAV6": "read 12345:7 analogInput 2",
    "VAV7": "read 12345:8 analogInput 1",
    "VAV8": "read 12345:9 analogInput 1",
    "VAV9": "read 12345:10 analogInput 2",
    "VAV10": "read 12345:11 analogInput 1"
  }

How could I loop through this by feeding this data into a function, parse keys into string values, and use conditional logic to verify each of key values seem appropriate?

Dumbing this down a little bit for one string:

var myVar = "read 12345:2 analogInput 2";

I can split this into pieces:

var myVarParts = myVar.split(" ");

And assign variables to each piece:

requestType = myVarParts[0];
console.log(requestType)

deviceAddress = myVarParts[1];
console.log(deviceAddress)

pointType = myVarParts[2];
console.log(pointType)

pointAddress = myVarParts[3];
console.log(pointAddress)

Trying to make up some conditional logic if the requestType is good if its a read, write, release:

if(requestType === "read"){
    console.log("Good on read");
  }else if(requestType === "write"){
    console.log("Good on write");
  }else if(requestType === "release"){
    console.log("Good on release");
  }else{
    console.log("BAD requestType");
  }

The pointType is good if its a analogInput, analogValue, binaryValue, binaryInput.

Could someone give me a tip on what a Boolean JavaScript function would look like that could loop through this data and verify the keys look OK?

const reqObjects = {
    "VAV1": "read 12345:2 analogInput 2",
    "VAV2": "read 12345:3 analogInput 1",
    "VAV3": "read 12345:4 analogInput 1",
    "VAV4": "read 12345:5 analogInput 2",
    "VAV5": "read 12345:6 analogInput 1",
    "VAV6": "read 12345:7 analogInput 2",
    "VAV7": "read 12345:8 analogInput 1",
    "VAV8": "read 12345:9 analogInput 1",
    "VAV9": "read 12345:10 analogInput 2",
    "VAV10": "read 12345:11 analogInput 1"
  }

Thank you I am trying to learn JavaScript.

CodePudding user response:

You could use the regex ^(read|write|release)\s(\d :\d )\s(analog|binary)(Input|Value)\s\d$ to match the pattern.


  • (read|write|release) are the options for the request type
  • (\d :\d ) makes sure the device address is made up of numbers separated by a colon
  • (analog|binary)(Input|Value) are the options for the point type
  • \d matches the single digit at the end

You can use Object.values and run <Array>.every to loop through the values and make sure they all match the pattern.

const regex = /^(read|write|release)\s(\d :\d )\s(analog|binary)(Input|Value)\s\d$/;

const reqObjects = {
  "VAV1": "read 12345:2 analogInput 2",
  "VAV2": "read 12345:3 analogInput 1",
  "VAV3": "read 12345:4 analogInput 1",
  "VAV4": "read 12345:5 analogInput 2",
  "VAV5": "read 12345:6 analogInput 1",
  "VAV6": "read 12345:7 analogInput 2",
  "VAV7": "read 12345:8 analogInput 1",
  "VAV8": "read 12345:9 analogInput 1",
  "VAV9": "read 12345:10 analogInput 2",
  "VAV10": "read 12345:11 analogInput 1"
}

console.log(Object.values(reqObjects).every(val => val.match(regex)))

CodePudding user response:

  • Using Object#values, get the list of values from the object.
  • Using Array#every, iterate over the above to validate each item, you can modify the validation helpers if needed.

const reqObjects = {
  "VAV1": "read 12345:2 analogInput 2",
  "VAV2": "read 12345:3 analogInput 1",
  "VAV3": "read 12345:4 analogInput 1",
  "VAV4": "read 12345:5 analogInput 2",
  "VAV5": "read 12345:6 analogInput 1",
  "VAV6": "read 12345:7 analogInput 2",
  "VAV7": "read 12345:8 analogInput 1",
  "VAV8": "read 12345:9 analogInput 1",
  "VAV9": "read 12345:10 analogInput 2",
  "VAV10": "read 12345:11 analogInput 1"
};

const validateRequestType = type => 
  ['read', 'write', 'release'].includes(type);
const validatePointType = type => 
  ['analogInput', 'analogValue', 'binaryValue', 'binaryInput'].includes(type);
const validate = str => {
  const [requestType, deviceAddress, pointType, pointAddress] = str.split(' ');
  return validateRequestType(requestType) && validatePointType(pointType);
} 
const valid = Object.values(reqObjects).every(validate);

console.log(valid);

  • Related