I have a json like this
{
"serial": "34AS9831",
"sensor_type": "Foo",
"value_registered": {
"value_type": "temperature",
"value": 34.6,
"unit_of_measure": "celsius"
},
"value_registered_at": "24/08/2021 14:05:34"
}
I need to check if all fields are set, and they must be non null.
The first solution is the follow:
try {
check_request(req, res);
let data = JSON.parse(req.body);
let isJSONBadFormatted =
data.serial == undefined ||
data.serial == null ||
data.sensor_type == undefined ||
data.sensor_type == null ||
data.value_registered == undefined ||
data.value_registered == null ||
data.value_registered.value_type == undefined ||
data.value_registered.value_type == null ||
data.value_registered.value == undefined ||
data.value_registered.value == null ||
data.value_registered.unit_of_measure == undefined ||
data.value_registered.unit_of_measure == null ||
data.value_registered_at == undefined ||
data.value_registered_at == null;
if(isJSONBadFormatted) {
unprocessable_json(res);
alert();
return;
}
insertDataIntoDB(data);
}catch(err){
/* TODO: implement alert function */
alert();
}
But I don't like this way. Is there a solution to write it in a more elegant way?
You may try this function:
const validate = (obj, validations) =>
validations.every(key => ![undefined, null].includes(key.split('.').reduce((acc, cur) => acc?.[cur], obj)));
Just need to provide an array that contains every property name that is not supposed to be empty.
const validate = (obj, validations) =>
validations.every(key => ![undefined, null].includes(key.split('.').reduce((acc, cur) => acc?.[cur], obj)));
const data = {
"serial": "34AS9831",
"sensor_type": "Foo",
"value_registered": {
"value_type": "temperature",
"value": 34.6,
"unit_of_measure": "celsius"
},
"value_registered_at": "24/08/2021 14:05:34"
};
const validations = [
'serial',
'sensor_type',
'value_registered',
'value_registered.value_type',
'value_registered.value',
'value_registered.unit_of_measure',
'value_registered_at'
];
console.log(validate(data, validations));
fields array that contains all the desired properties in the following manner:
Array and it is NOT inside the object return false.Array
false.checkFields with the correct object and the second element of the array (which is an array itself). Return false if checkFields fails.NOTE: I've increased the nesting by adding two more fields to value.
const obj = {
serial: "34AS9831",
sensor_type: "Foo",
value_registered: {
value_type: "temperature",
value: { record1: 35, record2: 67 },
unit_of_measure: "celsius",
},
value_registered_at: "24/08/2021 14:05:34",
};
const fields = [
"serial",
"sensor_type",
[
"value_registered",
["value_type", ["value", ["record1", "record2"]], "unit_of_measure"],
],
"value_registered_at",
];
const checkField = (obj, fields) => {
for (let field of fields) {
if (!Array.isArray(field)) {
if (obj?.[field] === undefined) return false;
} else if (!obj?.[field[0]] || !checkField(obj[field[0]], field[1]))
return false;
}
return true;
};
console.log(checkField(obj, fields));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With