2

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.

1
  • What's the specific problem? There are a number of ways an object can be iterated over, like getting Object.keys(theObject) or using for-in, then calling the validation function for each entry at that key. If you don't care about the keys you can get Object.values(theObject). Commented Dec 31, 2021 at 19:45

2 Answers 2

2

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

Sign up to request clarification or add additional context in comments.

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.