What if our output contains not only a single value, but an array of values? for example we're returning images
that holds list of images, how can we return it using uploadsUrl
function?
This is where our article is going to talk about, arrays of any kind.
Arrays
The concept here is actually pretty much simple, we'll just make a check if the value is an array, then we'll loop over it and apply on it our transformation functions, otherwise just apply the transformation functions on the value.
But as we're already making multiple checks, like if valueType
is string then make a built cast, if its a function then call it, and if it is a resource then parse it, so let's group all of these checks in one method so we can call it when the value is just a single value or its an array.
Transform value
We'll create a new method let's call it transformValue
which will basically receives two arguments, the value and the value type, and according to the value type we can decide how the value will be transformed.
// src/core/resources/resource.ts
// ...
/**
* Transform value
*/
protected transformValue(value: any, valueType: any) {
if (typeof valueType === "string") {
value = this.cast(value, valueType);
} else if (valueType.prototype instanceof Resource) {
value = new valueType(value);
} else if (typeof valueType === "function") {
value = valueType.call(this, value);
}
return value;
}
This method basically do the exact same thing we did earlier, but we just moved it in a separate method.
You may notice that the
valueType
if it is a function, i updated it to usecall
just to bind the resource object to it asthis
, this can be useful if the value type function is related to current resource class.
Now let's update our toJSON
method to use this new method.
// src/core/resources/resource.ts
// ...
/**
* {@inheritDoc}
*/
public toJSON() {
// final output
const data: Record<string, any> = {};
// loop through the output property
for (const key in this.output) {
// get the value type
const valueType = this.output[key];
// get the value, and also make sure to skip the output property if it is missing from the given resource
let value = get(this.resource, key, missingKey);
// skip the output property if it is missing from the given resource
if (value === missingKey) {
continue;
}
// just for now sett the output value to the data
data[key] = this.transformValue(value, valueType);
}
return data;
}
We replaced our code to use the new method transformValue
, this will firstly make our code cleaner, and also allows us to use the method when the value is an array.
// src/core/resources/resource.ts
// ...
/**
* {@inheritDoc}
*/
public toJSON() {
// final output
const data: Record<string, any> = {};
// loop through the output property
for (const key in this.output) {
// get the value type
const valueType = this.output[key];
// get the value, and also make sure to skip the output property if it is missing from the given resource
let value = get(this.resource, key, missingKey);
// skip the output property if it is missing from the given resource
if (value === missingKey) {
continue;
}
// check if value is an array
if (Array.isArray(value)) {
value = value.map((item) => this.transformValue(item, valueType));
} else {
// transform single value
value = this.transformValue(value, valueType);
}
}
return data;
}
And that's it, now we can pass a list of values or single value, doesn't matter it will always be transformed accordingly.
🎨 Conclusion
We did two things here in this article, we created a new method transformValue
which will transform a single value, and we also updated our toJSON
method to use this new method, and also to check if the value is an array, if it is then we'll loop over it and apply the transformation on each item.
☕♨️ Buy me a Coffee ♨️☕
If you enjoy my articles and see it useful to you, you may buy me a coffee, it will help me to keep going and keep creating more content.
🚀 Project Repository
You can find the latest updates of this project on Github
😍 Join our community
Join our community on Discord to get help and support (Node Js 2023 Channel).
🎞️ Video Course (Arabic Voice)
If you want to learn this course in video format, you can find it on Youtube, the course is in Arabic language.
📚 Bonus Content 📚
You may have a look at these articles, it will definitely boost your knowledge and productivity.
General Topics
- Event Driven Architecture: A Practical Guide in Javascript
- Best Practices For Case Styles: Camel, Pascal, Snake, and Kebab Case In Node And Javascript
- After 6 years of practicing MongoDB, Here are my thoughts on MongoDB vs MySQL
Packages & Libraries
- Collections: Your ultimate Javascript Arrays Manager
- Supportive Is: an elegant utility to check types of values in JavaScript
- Localization: An agnostic i18n package to manage localization in your project
React Js Packages
Courses (Articles)
Top comments (0)