I have a problem getting values from deeply nested objects: if one of the properties along the namespace is incorrect|modified|removed, Javascript throws. To avoid this, you can end up with obnoxious validation:
// Trying to get this.data.homeScene.user.name
const isValid = (
typeof this.data === 'object' &&
typeof this.data.homeScene === 'object' &&
typeof this.data.homeScene.user === 'object' &&
typeof this.data.homeScene.user.name === 'string'
);
if (isValid) {
const { name } = this.data.homeScene.user;
...
}
What if I made a reusable helper to validate the namespace and return the value?
export default function getNamespace(startObj, path) {
const isValidArgs = (
typeof startObj === 'object' &&
typeof path === 'string'
);
if (!isValidArgs) return undefined;
const finalValue = path
.split('.')
.reduce((obj, p) => ((typeof obj === 'object')
? obj[p]
: undefined
), startObj);{
return finalValue;
}
Now the obnoxious validation looks like this:
// Trying to get this.data.homeScene.user.name
const name = getNamespace(this, 'data.homeScene.user.name');
if (name) { ... }