DEV Community

Cover image for 81-Nodejs Course 2023: Resources: Working With Arrays
Hasan Zohdy
Hasan Zohdy

Posted on

81-Nodejs Course 2023: Resources: Working With Arrays

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;
  }
Enter fullscreen mode Exit fullscreen mode

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 use call just to bind the resource object to it as this, 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;
    }
Enter fullscreen mode Exit fullscreen mode

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;
    }
Enter fullscreen mode Exit fullscreen mode

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

Packages & Libraries

React Js Packages

Courses (Articles)

Top comments (0)